Welcome 微信登录

首页 / 操作系统 / Linux / Linux简单之美

(一)

话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是可以但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。
  1. section .data
  2. msg db "hello hopy!",0x0a
  3. section .text
  4. global _start
  5. _start:
  6. mov eax,4
  7. mov ebx,1
  8. mov ecx,msg
  9. mov edx,12
  10. int0x80
  11. mov eax,1
  12. mov ebx,0
  13. int0x80
关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h,可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,有2个,分别对应x86和x64.、编译连接指令如下:
  1. nasm -f elf main.asm
  2. ld main.o
运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成x64位的程序,或者指明是x86的程序,我选择后者:
  1. ld -m elf_i386 -o main main.o
哦鸟!

(二)

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事:
  1. section .data
  2. ft db "now is %d",10
  3. section .text
  4. extern puts
  5. externexit
  6. extern sleep
  7. extern printf
  8. global main
  9. main:
  10. mov edi,11
  11. again:
  12. dec edi
  13. push edi
  14. push ft
  15. call printf
  16. push 1
  17. call sleep
  18. cmp edi,0
  19. jnz again
  20. push msg
  21. call puts
  22. push 0
  23. call exit
  24. msg:
  25. db "happy xxx day!",0
以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中调用了C标准库中的函数.编译和以前一样:
  1. nasm -e elf main.asm
我们看看怎么连接:
  1. gcc -m32 -o main main.o
好鸟!运行正常.值得注意的是:我的OS是Ubuntu64,而asm代码中是32位的,如果开始用
  1. ld -m elf_i386 -lc -o main main.o
的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用
  1. sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so
创建软连接解决.但在运行时提示无法找到可执行文件!该文件明明在的!遂用gcc来连接,但要将_start改为main,还要装载32库
  1. sudo apt-get install ia32-libs
还会提示找不到h文件,这时再装载库
  1. sudo apt-get install g++-multilib
还有2族库,如有必要也可加载:
  1. sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386
  2. libstdc++5:i386 libstdc++6:i386
  3. sudo apt-get install libc6-i386
最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,这时改成如下即可:
  1. gcc -D_GNU_SOURCE -std=c99 main.c
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103624p2.htm
  • 1
  • 2
  • 下一页
Linux下使用bash删除目录中的特定文件可以在SSD上组建传统RAID吗?相关资讯      Linux简单之美  本文评论 查看全部评论 (0)
表情: 姓名: 字数