X86 64位汇编Linux'Hello World'连接问题

我试图跟进这个线程 ,不幸的是不能解决我的问题。 我试图运行的代码如下所示:

; File hello.asm section .data msg: db "Hello World!",0x0a,0 section .text global main extern printf main: push rbp mov rbp, rsp lea rdi, [msg] ; parameter 1 for printf xor eax, eax ; 0 floating point parameter call printf xor eax, eax ; returns 0 pop rbp ret 

我的系统是debian stretch:

 $ uname -a Linux <host> 4.8.0-1-amd64 #1 SMP Debian 4.8.7-1 (2016-11-13) x86_64 GNU/Linux 

我正在使用yasm汇编程序,如下所示:

 $ yasm -f elf64 -g dwarf2 hello.asm 

因为我在上面的源代码中的入口点main是最终的ret指令,所以我猜测我需要使用gcc而不是ld -e main

 $ gcc -lc hello.o 

但是,我收到以下错误消息:

 /usr/bin/ld: hello.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status 

这个错误提到了用-fPIC重新编译的问题,但这是一个gcc编译器选项,而不是汇编器yasm的有效选项。 所以我不知道该怎么做

只是为了testing,我试图链接到ld

 $ ld -e main -lc hello.o 

这是成功的,但是我得到了与上面的线程在运行时提到的相同的错误:

 $ ./a.out bash: ./a.out: No such file or directory # The file *is* there ... 

(根据线程的回答,我试图比较ld二进制文件中提到的.so库和我的系统库,它们都是/lib64/ld-linux-x86-64.so.2 。)

我也试图用_start (忘记现在正确退出程序的问题)replacemain入口点,并链接到ld -lc hello.o但是我得到了和以前一样的错误'没有这样的文件或目录'。 我会继续玩这个,但是我想我也会问。

任何工作build议(与main_startgccld )将受到热烈的赞赏。

编辑:正如吉姆build议,我已经添加了default relhello.asm的顶部,并获得与gcc链接不同的错误消息(没有改变与ld -e main -lc

 $ gcc -lc hello.o /usr/bin/ld: hello.o: relocation R_X86_64_PC32 against symbol `printf@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status 

编辑2:这篇文章涉及到debian stretch失败:

 Linux: 4.8.0-1-amd64 #1 SMP Debian 4.8.7-1 (2016-11-13) x86_64 GNU/Linux yasm: 1.3.0 gcc: (Debian 6.2.1-5) 6.2.1 20161124 ld: GNU ld (GNU Binutils for Debian) 2.27.51.20161220 

在Jim的评论之后, 我刚刚在 debian jessie 上testing了相同的代码, gcc -lc hello.o以及以下版本完全兼容:

 Linux: 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux yasm: 1.2.0 gcc: (Debian 4.9.2-10) 4.9.2 ld: GNU ld (GNU Binutils for Debian) 2.25 

编辑3:待迈克尔·佩奇的正式答案: 问题解决与 gcc -static hello.o

Solutions Collecting From Web of "X86 64位汇编Linux'Hello World'连接问题"