Assembly PowerPC汇编程序无法识别带有@h注释的未定义变量
如果我组装以下Assembly PowerPC汇编程序无法识别带有@h注释的未定义变量,assembly,powerpc,undefined-variable,Assembly,Powerpc,Undefined Variable,如果我组装以下PowerPC asm.as: li r0, hello nop li r0, hello@h nop 。。。我收到一条适当的错误消息: > powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob ../asm.as: Assembler messages: ../asm.as:2: Error: unsupported relocation against hello 这是因为hello未定义。错误是期望的行为。
PowerPC
asm.as
:
li r0, hello
nop
li r0, hello@h
nop
。。。我收到一条适当的错误消息:
> powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob
../asm.as: Assembler messages:
../asm.as:2: Error: unsupported relocation against hello
这是因为hello
未定义。错误是期望的行为。但是,如果我使用@h
(更高的16位)注释,它将静默汇编并假定hello
具有值0
:
asm.as
:
li r0, hello
nop
li r0, hello@h
nop
使用的命令:
$ powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob
$ powerpc-eabi-objcopy -O "binary" asm.ob asm
$ rm asm.ob
$ xxd -p asm
3800000060000000
当
hello
仍然未定义时,为什么汇编程序现在接受了这个新代码?有没有办法再次启用错误消息?我想立即查明是否使用了这样一个未定义的变量。第一个变量没有失败,因为hello
未定义。它之所以失败,是因为没有@h
您试图使用hello
的完整地址作为立即数,而且它太大了。此外,您也无法从对象复制中获得完整的信息。您应该在对象文件上运行objdump-dr
,以查看重新定位。将有一个用于hello
,类型与@h
匹配,与li
指令中立即数的位置对齐。据我所知,汇编总是允许您引用外部符号而不声明它。它成为对象文件中的重定位,链接器应用重定位来计算最终在可执行文件中结束的值。因此,在您尝试链接之前,诊断不会出错,并且无法包含定义hello
@WumpusQ.Wumbley的库或对象文件:这非常有用且正确。那么,您将如何尝试链接以检测未定义的变量呢?我猜代码也必须标记一个入口点,这样才能工作,但这不应该是必需的task@BullyWiiPlaza使用nm-u
查找未定义的符号。第一个符号没有失败,因为hello
未定义。它之所以失败,是因为没有@h
您试图使用hello
的完整地址作为立即数,而且它太大了。此外,您也无法从对象复制中获得完整的信息。您应该在对象文件上运行objdump-dr
,以查看重新定位。将有一个用于hello
,类型与@h
匹配,与li
指令中立即数的位置对齐。据我所知,汇编总是允许您引用外部符号而不声明它。它成为对象文件中的重定位,链接器应用重定位来计算最终在可执行文件中结束的值。因此,在您尝试链接之前,诊断不会出错,并且无法包含定义hello
@WumpusQ.Wumbley的库或对象文件:这非常有用且正确。那么,您将如何尝试链接以检测未定义的变量呢?我猜代码也必须标记一个入口点,这样才能工作,但这不应该是必需的task@BullyWiiPlaza使用nm-u
查找未定义的符号。