【问题标题】:how can I link with gcc without moving things in a .text section如何在不移动 .text 部分中的内容的情况下与 gcc 链接
【发布时间】:2017-12-01 22:57:23
【问题描述】:

我正在尝试用两个文件制作一个可执行文件:

  • vm.o,里面包含了一堆不可重定位的函数,
  • launcher.c,它有一个 main 函数来启动我的虚拟机。

vm.o 是一个 elf32 文件,其中包含预期在 0x401000 加载的 .text 代码段,如 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 来链接。

【问题讨论】:

    标签: gcc ld sections


    【解决方案1】:

    我终于找到了一种解决方法,虽然不完全相同,但效果很好。我可以在 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 的地址,但不适用于其他部分。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2011-02-22
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 2015-05-27
      • 2013-06-17
      相关资源
      最近更新 更多