Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 如何编写这个ld脚本?_Arm_Ld - Fatal编程技术网

Arm 如何编写这个ld脚本?

Arm 如何编写这个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

如果要链接除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        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手册)^_^