1. 程式人生 > 其它 >64位系統編譯TinyHelloWorld.c

64位系統編譯TinyHelloWorld.c

程式設計師的自我修養中,有一段是通過內嵌彙編來完成一個HelloWorld程式,這段彙編是32位的,在64位的機器上直接編譯就會出問題。

  1. 原始碼
/*
 *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();
}
  1. 編譯過程
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
  1. 使用ld連結指令碼

TinyHelloWOrld.lds

ENTRY(nomain)

SECTIONS

{

    . = 0x0804800 + SIZEOF_HEADERS;

    tinytext : { * (.text) *(.data) *(.rodata) }

    /DISCARD/ : { *(.coment) }

}
  1. 連結報錯

ld -static -e nomain -o TinyHelloWorld TinyHelloWorld.o

連結的時候加上"-m elf_i386"

ld -static -m elf_i386 -e nomain -o TinyHelloWorld TinyHelloWorld.o