64位系統編譯TinyHelloWorld.c
阿新 • • 發佈:2021-02-02
程式設計師的自我修養中,有一段是通過內嵌彙編來完成一個HelloWorld程式,這段彙編是32位的,在64位的機器上直接編譯就會出問題。
- 原始碼
/* *TinyHelloWorld.c */ char* str = "Hello World!\n"; void print(){ asm( "movl $13,%%edx \n\t" "movl %0,%%ecx \n\t" "movl $0,%%ebx \n\t" "movl $4,%%eax \n\t" "int $0x80 \n\t" ::"r"(str):"edx","ecx","ebx"); } void exit() { asm( "movl $42,%ebx \n\t" "movl $1,%eax \n\t" "int $0x80 \n\t"); } void nomain() { print(); exit(); }
- 編譯過程
gcc -c -fno-builtin -m32 TinyHelloWorld.c
-
-fno-builtin 不使用內建函式
-
-static 使用靜態連結的方式來連結程式
-
-e nomain 表示該程式的入口函式為nomain
-
-o TinyHelloWorld 表示指定輸出可執行檔名為TinyHelloWorld
原因就是64位的系統不能編譯32位的目標檔案
解決方案:
用-m32強制用32位API編譯,就可以編譯通過
gcc -c -fno-builtin -m32 TinyHelloWorld.c
- 使用ld連結指令碼
TinyHelloWOrld.lds
ENTRY(nomain) SECTIONS { . = 0x0804800 + SIZEOF_HEADERS; tinytext : { * (.text) *(.data) *(.rodata) } /DISCARD/ : { *(.coment) } }
- 連結報錯
ld -static -e nomain -o TinyHelloWorld TinyHelloWorld.o
連結的時候加上"-m elf_i386"
ld -static -m elf_i386 -e nomain -o TinyHelloWorld TinyHelloWorld.o