部分情况下我们需要将特定文件的特定段进行放入特定位置,在有源码的情况下,比较简单,但是有时候我们之后编译好的静态库。

由于.a文件是由.o文件压缩而来,所以想要修改.a文件,需要分别控制.o的链接位置。

可以通过ar -x libXXX.a解压,或者使用objdump -t libXXX.a查看所有文件。得到文件名之后(假设test0.o test1.o test2.o)

我们现在想把libXXX.a的data放入特定段,可以修改链接脚本

.data : {

. = ALIGN(0x4) ;

__sdata = .;

*(.data)

*(.data*)

修改为:

.data : {

. = ALIGN(0x4) ;

__sdata = .;

*(EXCLUDE_FILE(*test0.o test1.o test2.o).data*)

#此语句表示“除了3个.o文件之外的所有data*段”,所以需要删除下面两行,否则还是会链接到此处

*(.data)

*(.data*)

然后在需要放的位置修改链接脚本

.new_data :

{

. = ALIGN(0x4) ;

__newdata_start = . ;

*(.new_data) ;

*test0.o(.data*)

*test1.o(.data*)

*test2.o(.data*)

__newdata_end = . ;

} > NEW_PLACE

注意文件名前面的星号

NOLOAD :该section在程序运行时,不被载入内存。