摘自:http://bbs.kaspersky.com.cn/thread-281159-1-1.html
ld.info链接脚本解读
[Unix/Linux学堂]
时间搬移覆盖代码。
在覆盖区域的最后,定位计数器的值被设为覆盖区域的开始地址加上最大的节的长度。
这里是一个例子。记住这只会出现在‘SECTIONS’结构的内部。
OVERLAY 0x1000 : AT (0x4000) { .text0 { o1/*.o(.text) } .text1 { o2/*.o(.text) } }
这段代码会定义'.text0'和'.text1',它们都从地址0x1000开始。‘.text0'会被载入到地址0x4000处,而 '.text1'会被载入到紧随'.text0'后的位置。下面的几个符号会被定义:`__load_start_text0', `__load_stop_text0', `__load_start_text1', `__load_stop_text1'.
拷贝'.text1'到覆盖区域的C代码看上去可能会像下面这样:
extern char __load_start_text1, __load_stop_text1; memcpy ((char *) 0x1000, &__load_start_text1, &__load_stop_text1 - &__load_start_text1);
注意'OVERLAY'命令只是为了语法上的便利,因为它所做的所有事情都可以用更加基本的命令加以代替。上面 的例子可以用下面的完全特效的写法:
.text0 0x1000 : AT (0x4000) { o1/*.o(.text) } __load_start_text0 = LOADADDR (.text0); __load_stop_text0 = LOADADDR (.text0) + SIZEOF (.text0); .text1 0x1000 : AT (0x4000 + SIZEOF (.text0)) { o2/*.o(.text) } __load_start_text1 = LOADADDR (.text1); __load_stop_text1 = LOADADDR (.text1) + SIZEOF (.text1); . = 0x1000 + MAX (SIZEOF (.text0), SIZEOF (.text1)); |
|