我有一个非常奇怪的gcc
行为,我无法理解,也许有人可以向我解释一下(它一定很简单,但我没能在网上找到关于它的精确文档)。 / p>
我尝试使用gcc
在amd64程序集中编译一个非常简单的“Hello World”程序。为此,我尝试不依赖于libc和gcc
库。只是为了表明我最初不需要通过__libc_start_main()
。
这是我的代码(应该没问题):
.data # Data section
msg:
.ascii "Hello World!\n"
len = . - msg
.text # Text section
.globl _start
_start:
# Write the string to stdout
movq $len, %rdx
movq $msg, %rsi
movq $1, %rdi
movq $1, %rax
syscall
# and exit
movq $0, %rdi
movq $60, %rax
syscall
然后,我尝试用gcc
编译它:
#> gcc -m64 -Wall -Wextra -m64 -nostdlib -o hello_syscall hello_syscall.s
/usr/bin/ld: /tmp/ccDQWRW2.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
然后,添加-fPIC
根本没有帮助。但是,当我用-static
编译它时,它可以工作:
#> gcc -m64 -Wall -Wextra -m64 -nostdlib -static -o hello_syscall hello_syscall.s
#> ./hello_syscall
Hello World!
所以,我想知道为什么会出现这种行为以及我是否可以摆脱-static
选项(好吧,如果我知道为什么需要它,我会很高兴。)。