微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GNU AS .equ 指令可以从 -R 指定的外部对象中的全局符号中获取值吗?

如何解决GNU AS .equ 指令可以从 -R 指定的外部对象中的全局符号中获取值吗?

我正在使用的设置有点复杂,所以我将在这里简要解释游戏中的基本用法。我没有为可以出现在给定内存范围内不同位置的模块提供单独的链接描述文件,而是将通用链接描述文件中的原点/长度指定为全局符号。所以每个模块都可以为自己指定它的原点/长度作为全局符号,这很完美。这里没有问题。

一个稍微复杂一点的场景是采用具有自己独特链接描述文件的初始程序 (IP),并在后面的模块中创建 IP 时引用从 ld 生成的全局符号。例如,如果 IP 从 0xff0000 开始并且只有 0x100 字节,那么 _ip_text_end 将通过链接脚本创建为 0xff0100。

我们的想法是获取 _ip_text_end 符号并将其分配给模块原点全局符号,以使模块紧随其后出现在内存中。也就是说,而不是硬编码一个值:

.equ MODULE_ROM_ORIGIN,0xff0100
.global MODULE_ROM_ORIGIN

改为使用它:

.equ MODULE_ROM_ORIGIN,_ip_text_end
.global MODULE_ROM_ORIGIN

但是,无论我如何尝试,似乎都没有使用 MODULE_ROM_ORIGIN 值设置 _ip_text_end。需要明确的是,设置硬编码值可以正常工作,而且 _ip_text_end 肯定已设置。使用 -y 选项跟踪符号:

Linking MMD build/src/ipx.elf...
m68k-elf-ld -nostdlib -M -y _ip_text_end -y MODULE_ROM_ORIGIN -L/home/ryou/Projects/megadev/examples/bram/src -T/home/ryou/Projects/megadev/cfg/module_mmd.ld -obuild/src/ipx.elf build/src/ipx_layout.o build/src/ipx.o -Rbuild/src/ip.elf
m68k-elf-ld: build/src/ipx_layout.o: reference to _ip_text_end
m68k-elf-ld: build/src/ip.elf: deFinition of _ip_text_end
m68k-elf-ld: invalid origin for memory region MODULE_ROM

表示引用了符号,用-R引用IP对象时找到了定义,但MODULE_ROM_ORIGIN符号最终保持未定义...

我已经通读了几次 as 和 ld 手册,但我不明白为什么这行不通。任何输入将不胜感激,不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。