0

如果我想链接除 zo 之外的所有 .o 文件。所有 .o(无 zo)都重定位在 0xC0000000,而 zo 位于 0xFFFF0000 但 zo 位于文件偏移量 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 }
} 

这是正确的吗 ????

4

1 回答 1

1

如果您使用输入部分会容易得多。仅使用文件名不是执行此操作的正常方法。问题是在某些时候源模块会相互作用,您将在同一模块中使用来自多个位置的代码和/或数据。因此,制作部分loaderkloadervect并使用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 RAMGnu Linker give unexpected address以及此问题的相关链接。

于 2013-05-12T17:34:50.473 回答