我使用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
I create the object file like this
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 C库以及GCC 4.9.1编译器。