閱讀666 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

最後更新:2017-04-04 07:03:18

  上一篇:go Excel中通過數據有效性限製身份證長度
  下一篇:go ExecutorService線程池