我正在用x86汇编语言编写一个6502模拟器。所述仿真机的心脏是代码指针为每个操作码6502 256条目表:GCC x86汇编程序函数表
fns_asm:
.word opasm_brk // 0x00 BRK
.word opasm_ora_indzx // 0x01 ORA (,x)
.word opasm_undef
.word opasm_slo_indzx // 0x03: SLO (,x)
.word opasm_nop_zp // 0x04: NOP zp
...
opasm_brk:
< implementation of BRK instruction >
opasm_ora_indzx
< implmentation of ORA instruction >
... etc ...
的问题是,已编译的共享库(。所以)没有在运行时加载。报道在x86 Android的错误是:
的dlopen( “/ data/app中/ com.myapk/LIB/86/lib6502.so”,RTLD_LAZY)失败: dlopen的失败:无法找到符号 “” 通过引用“lib6502.so”
注意空符号名称,非常无益!
我已经发现,我的函数表是责备......如果我改变fns_asm为零入口表,或有一个常数,而不是一个标签(即“.word 0 “)然后.so加载正常。这是使用.word指令引用标签引起事情出错的原因。
我在做什么错?
x86系统上的一个词是16位(除非GNU汇编器已决定违反该约定)。你可能想用'.long'来代替。 – Michael
就是这样,非常感谢迈克尔!我一直在使用.word,因为我不是从头开始编写这个模拟器,而是移植多年前写的ARM汇编代码。使用.long使一切正常工作。把你的评论放在答案中,这样我就可以给你答案。 :) –