【发布时间】:2015-09-04 13:58:59
【问题描述】:
我正在用 x86 汇编语言编写一个 6502 仿真器。模拟机器的核心是每个 6502 操作码的 256 项代码指针表:
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 ...
问题是编译的共享库 (.so) 在运行时无法加载。 x86 Android上报的错误是:
dlopen("/data/app/com.myapk/lib/x86/lib6502.so", RTLD_LAZY) 失败: dlopen 失败:找不到“lib6502.so”引用的符号“”
注意空符号名,非常没用!
我发现应该归咎于我的函数表...如果我将 fns_asm 更改为零条目表,或者将单个条目更改为常量而不是标签(即“.word 0” ) 然后 .so 加载正常。使用 .word 指令引用标签会导致出错。
我做错了什么?
【问题讨论】:
-
x86 系统上的一个字是 16 位的(除非 GNU 汇编器决定打破这个约定)。您可能想改用
.long。 -
就是这样,非常感谢迈克尔!我一直在使用 .word,因为我不是从头开始编写这个模拟器,而是在移植几年前编写的 ARM 汇编代码。使用 .long 使一切正常。将您的评论放在答案中,以便我可以给您积分。 :)