【问题标题】:Is there any way to rename the section name in a .o or .a file compiled by gcc?有什么方法可以重命名 gcc 编译的 .o 或 .a 文件中的部分名称?
【发布时间】:2017-03-15 19:17:08
【问题描述】:

我有一个使用基于 gcc 的编译器编译的预编译库,我想将函数从默认的 .text 部分移动到其他部分名称(比如 foo)。有没有办法在不重新编译的情况下使用 binutils 做到这一点?

【问题讨论】:

  • 编辑链接描述文件。
  • ?这与这个问题无关;链接器根本不影响这个库,它只是编译器和ar 实用程序。
  • TR链接器负责链接最终的程序代码。 Ant,您可以在其中将每个输入文件中的部分分别 mpa 到输出的部分。段。所以,是的,它很好地参与其中。你只是在看错误的地方。当您最终链接输入文件中的未知部分时,您期望它会发生什么?
  • 例如,您可以使用objcopy --rename-section
  • @Olaf "当您最终链接输入文件中的未知部分时,您期望会发生什么? -- 我们的链接器脚本将不匹配的部分放入.text 输出部分,因此它不会改变链接的方式。我只是想将这个特定库中的程序目标代码划分为一个连续的区域。

标签: c gcc object-files


【解决方案1】:

. 库或静态库只不过是目标文件的集合。

因此,在链接之前,您可以使用 objcpy rename 命令来更改部分的名称。 同样,您也可以使用“-redefine-sym”更改符号名称

--rename-section oldname=newname[,flags] 将部分从 oldname 重命名为 newname,可选择更改 部分的标志到进程中的标志。这个有好处 过度使用链接描述文件来执行重命名,因为 输出保留为目标文件,不会成为链接 可执行文件。

用法:

objcopy -I binary -O <output_format> -B <architecture>
    --rename-section .data=.rodata,alloc,load,readonly,data,contents
    <input_binary_file> <output_object_file>

参考:http://man7.org/linux/man-pages/man1/objcopy.1.html

【讨论】:

    【解决方案2】:

    链接描述文件

    您也可以通过ld 使用链接描述文件重命名部分。

    ld -r -T section_rename.xsc -o output.o input.o

    section_rename.xsc 可能类似于以下内容:

    SECTIONS
    {
      .newtext : { *(.text) }
      .newdata : { *(.data) }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      相关资源
      最近更新 更多