在链接时使用-nostdlib编译_start标签失败

时间:2018-01-10 19:00:53

标签: gcc x86 x86-64 ldd

我有一个非常奇怪的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选项(好吧,如果我知道为什么需要它,我会很高兴。)。

0 个答案:

没有答案