使用64位Linux系统并使用NASM。
我试图将我的ASM文件(hello.asm)与C文件(main.c)链接,并编译成执行文件。
我创建了一个ASM文件,使用printHello函数通过printf打印“Hello”。
extern printf, exit
section .data
format db "Hello", 10, 0
section .text
global printHello
printHello:
sub rsp, 8
mov rsi, 0x12345677
mov rdi, format
xor rax, rax
call printf
mov rdi, 0
call exit
我创建了一个简单的main.c文件,并调用了我的函数"printHello"来打印"Hello"。
#include <stdio.h>
void printHello();
int main()
{
printHello();
}
我编译的命令:
$ nasm -f elf64 hello.asm
$ gcc -c main.c
$ gcc -o executable main.o hello.o
$ ./executable
并且它会打印出以下内容:
./executable: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
./executable: Symbol `exit' causes overflow in R_X86_64_PC32 relocation
[1] 6011 segmentation fault ./executable
我已经在学习汇编语言了。问题是来自我的指令还是代码?
file executable
的输出是什么?PS:同时,您可能可以将printf
更改为printf wrt ..plt
,并对exit
执行类似操作。 - Jester