问题描述
我正在使用的设置有点复杂,所以我将在这里简要解释游戏中的基本用法。我没有为可以出现在给定内存范围内不同位置的模块提供单独的链接描述文件,而是将通用链接描述文件中的原点/长度指定为全局符号。所以每个模块都可以为自己指定它的原点/长度作为全局符号,这很完美。这里没有问题。
一个稍微复杂一点的场景是采用具有自己独特链接描述文件的初始程序 (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 (将#修改为@)