【发布时间】:2014-12-09 02:06:55
【问题描述】:
我使用 NASM 创建了一个简单的 hello world,它从 libc 调用 printf 和 _exit,但不使用 main。
extern printf
extern _exit
section .data
hello: db 'Hello world!',10
section .text
global _start
_start:
xor eax, eax
mov edi, hello
call printf
mov rax, 0
jmp _exit
我这样创建目标文件
nasm -felf64 hello.asm
然后我可以像这样使用与 glibc 的动态链接来链接它
ld hello.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -melf_x86_64
这可以正常运行,没有错误。但现在我想静态地做。我愿意
ln -s `gcc -print-file-name=libc.a`
ln -s `gcc -print-file-name=libgcc_eh.a`
ld hello.o -static libc.a libgcc_eh.a libc.a -melf_x86_64
此链接但是当我运行代码时出现分段错误。使用gdb 我看到它给出了
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401004 in vfprintf ()
如果我用 C 编写一个简单的 hello world 并使用静态编译运行良好,那么显然可以静态链接到我系统上的 glibc。 如何在我的汇编代码中使用 glibc 的静态链接?
如果我链接到 glibc 的替代品,例如 musl-libc,它可以正常工作
ld hello.o -static /usr/local/musl/lib/libc.a -melf_x86_64
我使用的是 Ubuntu 14.04、eglibc 2.19 和 GCC 4.9.1
【问题讨论】: