Arm 如何编写这个ld脚本?
如果要链接除z.o以外的所有.o文件,则所有.o(无z.o)将重新定位在0xC0000000,而z.o位于0xFFFF0000,但z.o位于文件偏移量0x8000Arm 如何编写这个ld脚本?,arm,ld,Arm,Ld,如果要链接除z.o以外的所有.o文件,则所有.o(无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
那么,如何编写这个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 }
}
这是对的吗???如果你使用它,会更容易。仅仅使用文件名并不是正常的方法。问题是,在某个时刻,源模块将相互作用,您将在同一模块中使用来自多个位置的代码和/或数据。因此,制作节加载器、kloader和vect,并使用
gcc
或pragmas在节中放置代码/数据
你的问题在Gnu ld中得到了回答。输出节列表不必按内存顺序排列。将通配符{*.o(.text*)}
放在最后一个位置,不匹配的输入对象将放在此部分
示例注释函数可能如下所示:
void data_abort(unsigned int fsr, void* fault) __attribute__ ((section ("vector)))
通常,不同部分中的函数/数据必须协同工作,因此能够将它们混合在同一源文件中允许编译器对静态
项执行优化,并将功能相似的项分组在一起,即使它们可能位于不同的部分中
我想这可能大体上符合你的要求
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
code。通常,您希望至少将.text
、.data
和.bss
分开
始终生成一个映射文件,并仔细检查其中的地址。这比加载和检测代码以确定某些内容被放置在错误的地址要快得多
请参阅:,以及与此问题相关的链接。此处的模块表示源代码翻译单元。人们常说程序模块是指“C”文件。这个例子可能不会像现在这样起作用。对于覆盖,我只是在链接器文件中作弊并定义符号。例如,
节{.mmu_table=.;.init:{*(.init)}
。Bss清除、io muxing等可以位于.init
部分,并且可以方便地为MMU表对齐,但不能重复使用重置
代码。看看真正的方法。哦,对不起!z、 o是高向量。o,因此没有覆盖。。。。。。这是否意味着如果以前使用过z.o文件,它将不再包含在*.o中?我的ld脚本现在可以了。谢谢。。(似乎我需要阅读ld手册)^_^