gpt4 book ai didi

c - X86 64 位程序集 Linux 'Hello World' 链接问题

转载 作者:IT王子 更新时间:2023-10-29 00:47:47 26 4
gpt4 key购买 nike

我正在尝试跟进 this thread不幸的是,这并不能完全解决我的问题。我尝试运行的代码如下:

; 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 的有效选项。所以我不知道在这里做什么。

只是为了测试,我尝试与 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 替换 main 入口点(暂时忘记正确退出程序的问题)并用 ld -lc 链接hello.o 但是我得到了和以前一样的错误“没有这样的文件或目录”。我会继续玩这个,但我想我也会问。

任何可行的建议(使用 main_startgccld)将不胜感激。

编辑:正如吉姆所建议的那样,我在 hello.asm 的顶部添加了 default rel 并且在与 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

EDIT2:这篇文章与 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 上测试了相同的代码 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: 等待 Michael Petch 的正式答复:问题已解决 gcc -static hello.o

最佳答案

Debian Stretch 中的 GCC defaults to building position independent executables , 构建链接到特定地址的可执行文件,就像传统的传递 -no-pie 给 GCC 一样。

或者指定正确的重定位类型,我不知道如何在 yasm 中执行此操作。

关于c - X86 64 位程序集 Linux 'Hello World' 链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41845065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com