您的位置:首页 > 运维架构 > Linux

[原创]linux简单之美(二)

2014-07-07 19:19 281 查看
原文链接:linux简单之美(二)

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

section .data
ft db "now is %d",10

section .text
extern puts
extern exit
extern sleep
extern printf
global main

main:
mov edi,11
again:
dec edi
push edi
push ft
call printf

push 1
call sleep

cmp edi,0
jnz again

push msg
call puts

push 0
call exit

msg:
db "happy xxx day!",0


以上代码功能很简单,从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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: