如何编写这个ld脚本?

时间:2013-05-12 15:32:05

标签: arm ld

如果我想链接除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 }
} 

这是对的????

1 个答案:

答案 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 RAMGnu Linker giving unexpected address以及此问题的相关链接。