【问题标题】:GCC Linker - Specify Output Section for Code Included in Archive FilesGCC 链接器 - 为存档文件中包含的代码指定输出部分
【发布时间】:2013-05-21 14:08:29
【问题描述】:

背景

我正在使用 GNU Tools for ARM Embedded Processors 编译器,它是一个 GCC 编译器。我目前在 Windows 环境中工作。

我正在构建一个比较大的项目,并且已经成功编译了所有源代码,但是在链接阶段面临挑战。这个特定平台作为两个独立的 RAM 区域,我需要将目标代码的某些部分映射到特定区域。

我认为我应该能够使用链接器脚本,例如:

SECTIONS
{
   ER_CCM 0x10000000:
   {
      * (.bss)
   }
   ER_SRAM 0x20000000:
   {
      someLib.obj (.bss)
   }
}

但是,我的问题是编译器输出的是 .lib 文件(存档)而不是 .obj 文件。正在使用以下语法在所有存档文件的当前目录中调用链接器:

ld.exe --library-path=C:\SomePath\lib --Map C:\Somepath\bin\mapfile.map --script=C:\Somepath\bin\linkscript.ldf -( file1.lib file2.lib ... -)

即使 .lib 文件包含对 .obj 文件的引用,链接器仍抱怨它找不到文件 someLib.obj 可能是因为它没有给出知道映射所指文件的完整路径。

在链接器脚本中提供完整路径的链接器似乎也不起作用;指定目标文件中包含的符号仍显示在内存的第一部分。

问题

示例链接描述文件中的语法是否有效?第一部分的通配符会不会阻止section部分的指定文件被正确映射?

如何指定链接器将某些目标文件 within 归档文件映射到特定区域?这甚至可能吗?

【问题讨论】:

    标签: gcc linker ld linker-scripts


    【解决方案1】:

    事实证明,我的主要问题与Put gcc libs .data in specific section? 重复,但由于我还询问了通配符放置/顺序,我将发布此问题。

    我的第一个任务的答案:在其他部分之前放置一个通配符条目阻止其他部分正确导入指定的目标文件。这种行为是特定于链接器的,因为我见过其他链接器并非如此。

    解决这个问题的方法是确保将通用部分放在链接描述文件的最后:

    SECTIONS
    {
       ER_SRAM 0x20000000:
       {
          someLib.obj (.bss)
       }
       ER_CCM 0x10000000:
       {
          * (.bss)
       }
    }
    

    至于引用存档(.lib)文件中包含的目标文件。答案在链接的帖子中给出,但这里又是:

    在声明部分的嵌入对象文件中添加通配符:

    ER_SRAM 0x20000000:
    {
       *someLib.obj (.bss)
    }
    

    这里需要注意的是,由于在目标文件名中使用了通配符,如果文件丢失或条目拼写错误,链接器不会抛出错误。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2018-09-05
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多