第八题 - ld 脚本 - 指定自定义 symbol
本节目录
题目要求
编写一个 ld 文件(命名为 new_symbol.ld),设置内存区域起始地址为 0x8000000,长度为 0x2000,指定 .text 包含一个自定义的 symbol 名为 my_custom_symbol,其地址为 0x1111。
输入
# 将会在测试脚本中尝试:
# 打印 `my_custom_symbol` 的地址,匹配是否为 0000000008001111
# 起始地址 + symbol 偏移地址 应该是 0000000008001111
$(nm "$EXECUTABLE" | grep ' my_custom_symbol$' | awk '{print $1}')
输出
运行测试时,检测到"Test passed."字样。
已有代码介绍
MEMORY {
/* >>> 在这里定义内存区域,设置内存区域起始地址为 `0x8000000`,长度为 `0x2000`。 */
/* <<< */
}
SECTIONS {
.text : {
*(.text)
/* 其他段的定义 */
/* >>> 在这里添加 my_custom_symbol,地址设置 0x1111 。*/
/* <<< */
}
/* <<< */
/* 定义只读数据段,包含常量数据 */
.rodata : {
*(.rodata)
} > RAM
/* 定义BSS段,包含未初始化的全局变量和静态变量 */
.bss : {
*(.bss)
} > RAM
/* 定义程序头表 */
. = ALIGN(4);
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.dynamic : { *(.dynamic) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.eh_frame : { *(.eh_frame) }
. = ALIGN(8);
. = . + SIZEOF_HEADERS;
}
提示
你需要了解 ld 脚本的结构,之后,在 Memory 和 SECTIONS 内,按照中文注释完成对应要求。有和上一题相似的地方的话,可以考虑复用。
注意事项
无特殊注意事项