linux简单之美(二)
来源:互联网 发布:苹果手机端口号 编辑:程序博客网 时间:2024/05/01 17:32
我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用
C标准库中的函数快速做一些"复杂"的事:
section .dataft db "now is %d",10section .textextern putsextern exitextern sleepextern printfglobal mainmain:mov edi,11again:dec edipush edipush ftcall printfpush 1call sleepcmp edi,0jnz againpush msgcall putspush 0call exitmsg: 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
- linux简单之美(二)
- linux简单之美(一)
- linux简单之美(三)
- Linux简单命令之二
- 简单之美
- Erlang简单之美
- Linux哲学之美
- 数学之美 系列二
- 数据之美(二)
- newxy的简单之美
- 转贴:浅谈简单之美
- 数学之美 简单笔记
- 微信简单之美
- Linux学习之简单指令二
- 数学之美系列五 -- 简单之美简单之美::布尔代数和搜索引擎的索引
- 架构之美-读书笔记之二
- 项目管理之美连载(二)
- Qt之美(二):元对象
- 句柄和指针 一
- 句柄和指针 二
- 疑问 : 断点失效? 条件: vs2008在Win7X64真机和Win7X64虚拟机(vmware9.0)之间进行远程调试
- java环境变量配置
- pthread_barrier_init,pthread_barrier_wait,pthread_barrier_destroy简介
- linux简单之美(二)
- VS2008 如何将Release版本设置可以调试的DEBUG版本
- C++ 虚基类简单使用
- C中的符号表
- 句柄和指针 三
- hdu1996
- 2013 New Year’s Resolutions
- Oracle 11GR1进行创建数据库时出错解决一例
- C++ 智能指针