【问题标题】:gcc linker script difference between *(.rodata*) and *(.rodata.*)*(.rodata*) 和 *(.rodata.*) 之间的 gcc 链接器脚本区别
【发布时间】:2019-04-01 08:06:10
【问题描述】:

我们有一个链接描述文件,其中 .text 部分的一部分具有只读数据输入部分,指定为:

.text:
{
    ...
    *(.rodata .rodata* .gnu.linkonce.r.*)
    ...
}

但是,其他带有尾随通配符的输入部分通常在名称和通配符之间有一个.。点赞:*(.text .text.* .gnu.linkonce.t.*)

链接器处理. 和通配符组合的方式有区别还是没有区别?

.rodata* 应该是 .rodata.* 吗?

【问题讨论】:

  • 列出几个目标文件的部分,看看是否有.rodata.*部分。如果没有,那么脚本可能没问题。
  • 是的,@Someprogrammerdude 是对的。如果你有汇编代码,你可能有任意命名的部分。因此,您必须在所有构建方案中遍历 所有 目标文件,并确保所有 .rodata 部分名称后跟 .。而.这里只是一个点,不是正则表达式特殊字符;你意识到这一点,不是吗? (是的,不同。)

标签: gcc linker


【解决方案1】:

.text* 比更明确的.text .text.* 更短,虽然不等价。它会选择其他部分,如.text_foo。这可以是有意的(也许是为了使其更独立于编译器约定?)。

https://sourceware.org/binutils/docs/ld/Input-Section-Wildcards.html

.* 部分是由 gcc 生成的,如果你传递了-ffunction-sections。数据和-fdata-sections 也是如此。

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2019-02-11
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2011-05-31
    相关资源
    最近更新 更多