【发布时间】:2020-04-30 22:17:09
【问题描述】:
我有这个:
$ make build
read.o: In function `_start':
read.asm:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'build' failed
make: *** [build] Error 1
来自这个汇编:
global main
section .text
main: mov rax, 1 ; system call for write
mov rdi, 1 ; file handle 1 is stdout
mov rsi, message ; address of string to output
mov rdx, 13 ; number of bytes
syscall ; invoke operating system to do the write
mov rax, 60 ; system call for exit
xor rdi, rdi ; exit code 0
syscall ; invoke operating system to exit
section .data
message: db "Hello, World", 10 ; note the newline at the end
我正在运行它:
$ nasm -felf64 read.asm -o read.o && gcc read.o -o store && ./store
如何将单词main 更改为main 或_start 以外的其他名称,例如begin 或myentrypoint?我想定制它。还能定制吗?
【问题讨论】:
-
您的 asm 定义了
main,而不是_start,因此此gcc read.o是将其与调用main的 CRT 启动文件链接的正确命令。您打算使用minimal reproducible example 使用_start:而不是main:,以便您使用gcc -static -nostdlib read.o构建静态可执行文件吗?或者干脆ld read.o -o store。我有一个asm-link包装脚本,它将单个文件组合+链接到一个可执行文件中,包含在我对 Assembling 32-bit binaries on a 64-bit system (GNU toolchain) 的回答中