【问题标题】:Howto pass commands to the linker script via .pro file (Qt)如何通过 .pro 文件 (Qt) 将命令传递给链接器脚本
【发布时间】:2015-03-20 13:06:50
【问题描述】:

我将 Qt 5.3.2 与 GCC 4.8.2 一起使用。我想通过 .pro 文件 (qmake) 将节定义插入到 qmake 创建的链接器脚本中。

我要插入的内容:

SECTIONS 
{
.legacy_vars :
{
    *myModule.o (.bss)
    *myModule.o (.data)
}
.everything_else :
{
    * (.bss)
    * (.data)
    * (.text)
}
}

这可能吗? 提前致谢!

回答“为什么?”的问题:

我的项目中有无法更改的遗留代码。但我需要重置它的变量来重置它的状态。同时,它们中的大多数是静态的,没有访问它们的功能。因此,我想将遗留代码变量映射到定义的部分,在启动程序时读取它们,如果需要,将它们写回以重置程序的这一部分。

【问题讨论】:

    标签: c++ qt gcc linker qmake


    【解决方案1】:

    找到解决办法:

    首先,我在网上找到的“简单链接器脚本示例”不正确/不完整/无法用于 PC 应用程序(例如:link)。所以我做了以下事情:

    1. 将 GCC 的默认链接描述文件读出到一个文件中:“ld --verbose > ld_script.ld”
    2. 删除了详细命令生成的前导附加信息:

      GNU ld (GNU Binutils) 2.24
        Supported emulations:
         i386pe
      using internal linker script:
      ==================================================
      

    最后:

        ==================================================
    
    1. 将我的附加链接命令插入到链接器脚本中:

      .data BLOCK(__section_alignment__) : {
          __data_start__ = . ;
          _legacy_code_data_start = . ;
          *legacy_module_first.o(.data*)
          *legacy_module_next.o(.data*)
          *legacy_module_last.o(.data*)
          _legacy_code_data_end = . ;
          *(.data)
          *(.data2)
          *(SORT(.data$*))
          *(.jcr)
          __data_end__ = . ;
          *(.data_cygwin_nocopy)
      }
      

    和:

        .bss BLOCK(__section_alignment__) : {
            __bss_start__ = . ;
            _legacy_code_bss_start = . ;
            *legacy_module_first.o(COMMON)
            *legacy_module_first.o(.bss)
            *legacy_module_next.o(COMMON)
            *legacy_module_next.o(.bss)
            *legacy_module_last.o(COMMON)
            *legacy_module_last.o(.bss)
            _legacy_code_bss_end = . ;
            *(.bss)
            *(COMMON)
            __bss_end__ = . ;
        }
    
    1. 将脚本文件添加到 Qt 项目中
    2. 通过 .pro 文件将链接描述文件添加到链接中:

      QMAKE_LFLAGS += "-T ../pathtoscript/ld_script.ld"
      
    3. 完成。

    “-T”告诉链接器使用定义的文件而不是链接器的默认文件。之前这会导致错误,因为我编写的链接器文件不完整。

    结果如下,可以在地图文件中看到(要创建地图文件,请使用:QMAKE_LFLAGS += "-Wl,-Map=output.map"):

    链接描述文件中定义的遗留模块的 .data 变量将放在符号“_legacy_code_data_start”和“_legacy_code_data_end”之间,.bss 和 COMMON 变量将放在符号“_legacy_code_bss_start”和“_legacy_code_bss_end”之间。这些符号可以通过在 C/C++ 代码中声明它们来使用:“extern void * legacy_code_data_start;”等等。因此,我现在可以读取这两个数据块并随时将它们写回。

    【讨论】:

    • 链接描述文件的路径应该像这样添加到 .pro 文件中,以独立于构建路径(根据构建系统可能不同) QMAKE_LFLAGS += "-T $$ PWD/linker_script.ld"
    猜你喜欢
    • 2015-10-13
    • 2015-04-17
    • 2012-06-19
    • 2017-04-20
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多