-
demo.c
int printf(const char * format, ...); extern char* _binary_demo_c_start; int main() { printf("%s\n", &_binary_demo_c_start); return 0; }
-
makefile
all: gcc -c demo.c -o demo.o objcopy -I binary -O elf64-x86-64 demo.c code.o gcc demo.o code.o
-
运行
$ make && ./a.out
-
查看链接情况
$ objdump -ht demo.o ... 0000000000000000 g F .text 000000000000001a main 0000000000000000 *UND* 0000000000000000 _binary_demo_c_start 0000000000000000 *UND* 0000000000000000 _GLOBAL_OFFSET_TABLE_ ... $ objdump -ht code.o 节: Idx Name Size VMA LMA File off Algn 0 .data 00000098 0000000000000000 0000000000000000 00000040 2**0 CONTENTS, ALLOC, LOAD, DATA SYMBOL TABLE: 0000000000000000 g .data 0000000000000000 _binary_demo_c_start 0000000000000098 g .data 0000000000000000 _binary_demo_c_end 0000000000000098 g *ABS* 0000000000000000 _binary_demo_c_size $ objdump -ht a.out ... 00000000000040c8 g .data 0000000000000000 _binary_demo_c_end 0000000000004030 g .data 0000000000000000 _binary_demo_c_start ...
可以看到demo.o 中 _binary_demo_c_start 还没有被链接, code.o 放在 .data 区, 并且有一个全局的 SYMBOL _binary_demo_c_start, a.out 文件以及链接完成, 并给出 SYMBOL 地址
网友评论