如果我想链接除z.o之外的所有.o文件。所有.o(no z.o)在0xC0000000处重新定位,而z.o在0xFFFF0000但z.o位于文件偏移0x8000处。
那么怎么写这个ld脚本?
这是我的loader.lds
SECTIONS {
loader 0x00000000 : { start.o loader.o }
kloader 0x30100000 : AT(4096) { loaderk.o ../lib/klib.a }
vect 0xFFFF0000 : AT(0x4000) { high_vect.o }
}
这是对的????
答案 0 :(得分:1)
使用input sections会更容易。仅使用文件名不是正常的方法。问题是,在某些时候,源模块将互动,您将从同一模块中使用的多个位置获得代码和/或数据。因此,创建 loader , kloader 和 vect 部分并使用gcc
attributes或 pragma 将代码/数据放入部分。
您的问题已在 Gnu ld's Input section example中得到解答。输出节列表不必按内存顺序排列。最后放置通配符 { *.o(.text*) }
,输入不匹配的对象将放在此部分中。
示例注释函数可能看起来像
void data_abort(unsigned int fsr, void* fault) __attribute__ ((section ("vector)))
通常,不同部分中的函数/数据必须合作,因此能够将它们混合在同一源文件中允许编译器对static
项执行优化并保持功能相似的项组合在一起,即使它们可能位于不同的部分。
我认为这通常可以遵循您的要求。
SECTIONS {
loader 0x00000000 : { start.o loader.o }
kloader 0x30100000 : AT(4096) { loaderk.o ../lib/klib.a }
vect 0xFFFF0000 : AT(0x4000) { high_vect.o }
vect2 0xFFFF0000 : AT(0x8000) { z.o } /* overlay? */
text 0xC0000000 : { *.o }
}
我不确定你是否打算覆盖这些载体。您可以使用某些数据表覆盖init
代码。通常,您希望至少将.text
,.data
和.bss
分开。
始终生成地图文件并仔细检查那里的地址。这比加载和检测代码以确定某些内容放在错误的地址要快得多。
请参阅:Running code from RAM,Gnu Linker giving unexpected address以及此问题的相关链接。