背景
我正在使用 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
,因为它没有给出完整路径来知道映射所引用的文件
在链接器脚本中为链接器提供完整路径似乎也不起作用;指定目标文件中包含的符号仍显示在内存的第一部分中。
问题
示例链接描述文件中的语法是否有效?第一部分中的通配符是否会阻止部分部分中的指定文件正确映射?
如何指定链接器将存档文件中的某些目标文件映射到特定区域?这甚至可能吗?
答案 0 :(得分:2)
事实证明,我的主要问题是Put gcc libs .data in specific section?的重复,但由于我还询问了通配符的位置/顺序,我将发布此问题。
我的第一个任务的答案:在其他部分之前放置通配符将阻止其他部分正确导入指定的目标文件。这种行为是特定于链接器的,因为我已经看到了其他链接器,但事实并非如此。
解决此问题的方法是确保将通用部分放在链接描述文件的最后部分:
SECTIONS
{
ER_SRAM 0x20000000:
{
someLib.obj (.bss)
}
ER_CCM 0x10000000:
{
* (.bss)
}
}
至于引用归档(.lib)文件中包含的目标文件。答案在链接的帖子中给出,但在这里又是:
在delcaration部分的嵌入式目标文件中添加通配符:
ER_SRAM 0x20000000:
{
*someLib.obj (.bss)
}
这里需要注意的是,由于在目标文件名中使用了通配符,如果文件丢失或条目拼写错误,链接器将不会抛出错误。