如何在不移动.text部分的内容的情况下链接gcc

时间:2017-12-01 22:57:23

标签: gcc ld sections

我试图用两个文件制作一个可执行文件:

  • 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放在0x401000vm.o放在0x4010fb

有没有一种简单的方法可以告诉gcc将vm.o的.text部分放在所需的位置?我知道用ld做这个的方法,但我宁愿用gcc来链接。

1 个答案:

答案 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的地址,但不适用于其他部分。