GCC 链接器 - 指定存档文件中包含的代码的输出部分

标签 gcc linker ld linker-scripts

背景

我正在使用ARM嵌入式处理器的GNU工具编译器,它是一个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中的通配符会导致section节中的指定文件无法正确映射吗?

如何指定链接器将存档文件中的某些目标文件映射到特定区域?这可能吗?

最佳答案

事实证明,我的主要问题是 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)
}

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

关于GCC 链接器 - 指定存档文件中包含的代码的输出部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16760961/

相关文章:

c - GCC 正在生成充满零的二进制文件

c - GCC 兼容多种架构的最高指令集

c - Flex 和 bison 定义自己的 'main' 函数

全局变量的 C ld 链接时错误

linux - 使用 -finstrument-functions 构建 glibc

c++ - 如何强制 Eclipse 使用 g++ 而不是 gcc?

ios - 本地化 xib 时出现 Xcode 链接器错误

c++ - 包含 C 文件/与 CMake 的链接不适用于 C++ : cannot include function

c - 如果变量在声明时初始化并链接到 NOLOAD 部分,有没有办法抛出链接时间错误?

linux - 是否可以在不访问库本身的情况下链接到共享库?