我试图用两个文件制作一个可执行文件:
vm.o
,其中包含许多不可重定位的函数,launcher.c
,其main
功能启动了我的虚拟机。 vm.o
是一个elf32文件,其中.text部分代码需要加载到0x401000
,如objdump -x vm.o
所示。
...
SYMBOL TABLE:
00401000 l d .text 00000000 .text
00401000 g .text 00000000 _binary_vm_o_start
....
我正在运行这样的gcc:
gcc -no-pie -m32 -o vm vm.o loader.c -ldl
但生成的文件会忽略vm.o中指定的位置。如果我做
gcc -no-pie -m32 -o vm vm.o loader.c -ldl -Ttext 0x401000
我接近了,但_start
放在0x401000
,vm.o
放在0x4010fb
。
有没有一种简单的方法可以告诉gcc将vm.o
的.text部分放在所需的位置?我知道用ld做这个的方法,但我宁愿用gcc来链接。
答案 0 :(得分:0)
我终于找到了一种解决方法,虽然不完全一样,但效果很好。我可以在vm.o中重命名我的.text部分(这样它就不会与其他的.text部分合并),然后让gcc将该特定部分放在所需的位置:
# change the name of .text section to .vm
objcopy --rename-section .text=.vm,contents,alloc,load,code vm.o vm-temp.o
# compile setting .vm to 0x401000 (no-pie means no position-independent code)
gcc -no-pie -m32 -o vm vm-temp.o loader.c -Wl,--section-start=.vm=0x401000 -ldl
请注意,gcc中的-T
仅适用于更改.text的地址,但不适用于其他部分。