歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux簡單之美

Linux簡單之美

日期:2017/2/28 14:30:30   编辑: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

Copyright © Linux教程網 All Rights Reserved