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
上一篇:
Excel中通過數據有效性限製身份證長度
下一篇:
ExecutorService線程池
《數據結構與抽象:Java語言描述(原書第4版)》一 引 言-組 織 數 據
【CDN 最佳實踐】CDN緩存策略解讀和配置策略
《Linux From Scratch》第二部分:準備構建 第四章:最後的準備- 4.3. 添加 LFS 用戶
560萬Facebook人際關係數據,揭秘家庭職業傳承“真相”
ssh框架搭建
google chrome feature shorcuts
關於 Oracle 的數據導入導出及 Sql Loader (sqlldr) 的用法
Xcode5 支持 iOS5 問題解決過程記錄
Apache Storm 官方文檔 —— 多語言接口協議
如何修改request的parameter的幾種方式