如果您使用输入部分会容易得多。仅使用文件名不是执行此操作的正常方法。问题是在某些时候源模块会相互作用,您将在同一模块中使用来自多个位置的代码和/或数据。因此,制作部分loader、kloader和vect并使用gcc
属性或编译指示将代码/数据放置在部分中。
您的问题已在Gnu ld 的 输入部分示例中得到解答。输出节列表不必按内存顺序排列。将通配符 { *.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 give unexpected address以及此问题的相关链接。