环境是 32 位 SPARC 上的 Solaris,但我认为这是动态链接和/或与位置无关的代码更普遍的问题。
我有一个汇编程序,我将其编译为与位置无关的代码,并从 C 程序动态链接到它。它工作正常,除了我不能从汇编程序中引用汇编程序保留的任何内存。在汇编程序中跳转可以正常工作。
我只想在汇编程序中读取和写入内存,但是任何时候我尝试都会遇到分段错误。
我写了这个测试程序来调试这个问题
.section ".data"
.global foo
foo: .word 1
.section ".text"
.global testprog
testprog:
save %sp, -(92+4), %sp
sethi %hi(foo), %o0 ! set foo, %o0
or %o0, %lo(foo), %o0
call print_int
nop
ret
restore
我编译这个
作为 -K PIC -b
并在 C 中 dlopen 生成的 .so
dlhandle = dlopen(obj_file, RTLD_NOW)
dl_testprog = dlsym(dlhandle, "testprog")
当我打电话时dl_testprog()
,它会打印“4”。如果我尝试打印 testprog 或 print_int 的地址,它也会打印“4”。跳转到一个标签,其他一切都很好。查看反汇编,foo 被替换为 0x0,就像它应该的那样。
我是否必须通过_GLOBAL_OFFSET_TABLE_
或其他什么,才能在汇编程序中写入我自己的内存?如果是这样,我该怎么做?我尝试的一切都导致了段错误,并且我无法找到一个很好的指导如何做到这一点(这让我相信你不应该这样做。这不是链接器问题吗?) .