【发布时间】:2018-06-19 17:16:08
【问题描述】:
我正在尝试使用 NASM 和 GCC 编写程序:
global main
extern puts
section .data
hi db 'hello', 0
section .text
main:
push hi
call puts
ret
我正在构建:
nasm -f elf64 main.asm
gcc main.o -o main
rm main.o
我明白了:
/usr/bin/ld: main.o: relocation R_X86_64_32S 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
从this 和this 等示例中存在奇怪的堆栈操作来看,我感觉我做错了一些事情。但是,出于某种原因,我找不到任何实际解释的文档(事实上,我几乎找不到任何有用的文档,一般来说,使用 NASM 进行 64 位开发,这使我所做的一切' 到目前为止真的很痛苦),并且添加类似的东西对我的错误输出没有任何影响。
更新:
如果我将主要更改为:
push rbp
mov rax,0
mov rdi, hi
call [puts wrt ..got]
pop rbp
mov rax,0
ret
它编译得很好,但是在运行而不是实际打印时给了我一个段错误。我也不明白为什么我要从堆栈中推送和拉取 rbp 的值,以及为什么 rax 的值在这种情况下很重要。
【问题讨论】:
标签: c linux assembly nasm libc