Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过.pro文件(Qt)将命令传递给链接器脚本_C++_Qt_Gcc_Linker_Qmake - Fatal编程技术网

C++ 如何通过.pro文件(Qt)将命令传递给链接器脚本

C++ 如何通过.pro文件(Qt)将命令传递给链接器脚本,c++,qt,gcc,linker,qmake,C++,Qt,Gcc,Linker,Qmake,我将Qt5.3.2与GCC4.8.2一起使用。我想通过.pro文件(qmake)向qmake创建的链接器脚本插入节定义 我想插入的内容: SECTIONS { .legacy_vars : { *myModule.o (.bss) *myModule.o (.data) } .everything_else : { * (.bss) * (.data) * (.text) } } 这可能吗? 提前谢谢 回答“为什么?”: 我的项目中有无法更改的遗留代码

我将Qt5.3.2与GCC4.8.2一起使用。我想通过.pro文件(qmake)向qmake创建的链接器脚本插入节定义

我想插入的内容:

SECTIONS 
{
.legacy_vars :
{
    *myModule.o (.bss)
    *myModule.o (.data)
}
.everything_else :
{
    * (.bss)
    * (.data)
    * (.text)
}
}
这可能吗? 提前谢谢

回答“为什么?”:

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

找到了一个解决方案:

首先,我在网上找到的所有“简单链接器脚本示例”都不适用于PC应用程序(如:)。因此,我做了以下工作:

  • 将GCC的默认链接器脚本读入一个文件:“ld--verbose>ld_script.ld”
  • 删除了由verbose命令生成的前导附加信息:

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

        ==================================================
    
  • 将我的添加链接命令插入链接器脚本:

    .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)
    }
    
  • 以及:

  • 将脚本文件添加到Qt项目中
  • 通过.pro文件将链接器脚本添加到链接中,其中包含:

    QMAKE_LFLAGS += "-T ../pathtoscript/ld_script.ld"
    
  • 完成了
  • “-T”告诉链接器使用定义的文件,而不是链接器的默认文件。在此之前,这导致了错误,因为我编写的链接器文件不完整

    结果如下,可以在映射文件中看到(要创建映射文件,请使用:QMAKE_LFLAGS+=“-Wl,-map=output.map”):


    链接器脚本中定义的遗留模块的.data变量将放在符号“\u遗留代码\u data\u start”和“\u遗留代码\u data\u end”之间,而.bss和公共变量将放在符号“\u遗留代码\u bss\u start”和“\u遗留代码\u bss\u end”之间。可以通过在C/C++代码中声明这些符号来使用这些符号:“extern void*legacy_code_data_start;”等等。因此,我现在可以读取这两个数据块,并在需要时将它们写回。

    链接器脚本的路径应该像这样添加到.pro文件中,以独立于构建路径(根据构建系统的不同而不同)QMAKE_LFLAGS+=“-T$$PWD/linker_script.ld”
    QMAKE_LFLAGS += "-T ../pathtoscript/ld_script.ld"