原文链接:linux简单之美(二)

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事:

 section .data
ft db "now is %d", section .text
extern puts
extern exit
extern sleep
extern printf
global main main:
mov edi,
again:
dec edi
push edi
push ft
call printf push
call sleep cmp edi,
jnz again push msg
call puts push
call exit msg:
db "happy xxx day!",

以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中调用了C标准库中的函数.编译和以前一样:

nasm -e elf main.asm

我们看看怎么连接:

gcc -m32 -o main main.o

好鸟!运行正常.值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,如果开始用 ld -m elf_i386 -lc -o main main.o的方式,首先会提示找不到c库,这时可以进入/usr/lib,然后使用:

sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so

创建软连接解决.但在运行时提示无法找到可执行文件!该文件明明在的!遂用gcc来连接,但要将_start改为main,还要装载32库:

sudo apt-get install ia32-libs

还会提示找不到h文件,这时再装载库:

sudo apt-get install g++-multilib

还有2族库,如有必要也可加载:

sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386

libstdc++5:i386 libstdc++6:i386

sudo apt-get install libc6-i386

最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,这时改成如下即可:

gcc -D_GNU_SOURCE -std=c99 main.c

[原创]linux简单之美(二)的更多相关文章

  1. [原创]linux简单之美(三)

    原文链接:linux简单之美(三) 在linux简单之美(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式来搞呢?显然可以! section .data ft db sectio ...

  2. [原创]linux简单之美(一)

    原文链接:linux简单之美(一) 话说windows也有syscall,这是必须的.但是win的syscall可以直接call吗?可以是可以但是破费周折,搞成SDT之类的复杂概念.下面看看linux ...

  3. Linux内核分析(二)----内核模块简介|简单内核模块实现

    原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某 ...

  4. Linux应急响应(二):捕捉短连接

    0x00 前言 ​ 短连接(short connnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一 ...

  5. <转>简单之美——系统设计黄金法则

    作者: 包云岗  发布时间: 2012-05-19 13:06  阅读: 3036 次  推荐: 1   原文链接   [收藏] 最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自 ...

  6. Linux磁盘分区(二):删除

    ***********************************************声明************************************************ 原创 ...

  7. deepin linux 学习笔记(二)——文本编辑器

    目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...

  8. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  9. Linux及安全实践二

    Linux及安全实践二   基本内核模块 20135238 龚睿 1.  理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...

随机推荐

  1. c# List<string>和List<int>互相转换

    List<string> 转 List<int> var list = (new[]{"1","2","3"}).T ...

  2. 逗号" , "表达式

    概述 逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值. 语法 expr1, expr2, expr3... 参数 expr1, expr2, expr3... 任一表达式 ...

  3. iOS设计模式解析(五)责任链模式

    责任链模式:使多个对象都有机会处理请求,从而避免发送者和接受者之间发生耦合. 应用场景: 有多个对象可以处理请求,而处理程序只有在运行时才能确定 例如: 英雄联盟中伤害计算,伤害类型分为AP.AD.真 ...

  4. jvm强制类型转换

    public class Integer_Object { public static void main(String[] args){ Object obj = new ooo(); // Int ...

  5. 屏蔽错误:LNK2038

    最近在使用Qt(VS2010编译)的过程中,需要调用COM库,在Qt中加入了QAxContainer模块,是一个LIB库,在把编译模式从Debug改为Release 后链接报告了一堆错误 -1: 错误 ...

  6. 与时间有关的windows函数

    (一)time_t time(time_t *t) 如果t是空指针,直接返回当前时间.如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间. 这个函数的返回值,是指自 Unix 纪元(J ...

  7. C指针--通过二级指针往回拉数据

    现在有这种需求,在main函数中建立一个二叉树的root结点的指针,在tree_create函数中malloc或者new一个二叉树结点,然后在main函数中能正常的访问这个新建的结点. 注:这里的tr ...

  8. jquery与ajax的应用

    1.编写第一个Ajax的例子,先来看一下传统的JavaScript实现的ajax例子. 首先在前台页面中书写HTML代码. <input type="button" valu ...

  9. php curl封装类

    一个php curl封装的类,减少代码量,简化采集工作.这个类也是我工作的最常用的类之一.这里分享给大家.配合上phpquery,十分好用. <?php namespace iphp\core; ...

  10. python 学习day5(模块)

    一.模块介绍 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能 ...