我有很多代码都写在32位机器上。现在我已升级到64位,它不会加载共享对象。共享对象编译为32位(对于DMD使用-m32
标志),主机应用程序也是如此。
这是共享库:
module lib;
export extern(C) int abcd(){
return 4;
}
使用dmd -shared -m32 lib.d
进行编译,输出为lib.so
这是加载器的代码:
module loader;
import std.stdio;
import core.sys.posix.dlfcn;
alias func = extern(C) int function();
void main(string[] args){
writeln("reached 0, press enter");readln;
void* so = dlopen("/home/nafees/Desktop/temp/lib.so",RTLD_LAZY);
writeln("reached 1, press enter");readln;
func f = cast(func)dlsym(so,"abcd");
writeln((*f)());
}
这是使用dmd -m32 loader.d
编译的。它编译得很好,但是当我运行它时,它运行正常直到dlopen
,然后导致segmentation fault(core dumped)
。这曾经在32位上正常工作。
此代码有什么问题,为什么它不起作用?
P.S:我不想将其编译为64位,因此如果解决方案需要删除-m32
,我需要另外一个。
编辑:我有一个编译的程序(也用D编写),它使用dlopen加载一个共享对象(也用D编写)。该程序可以在32位运行良好,但不能在我的64位机器上运行。
EDIT2:我现在尝试在没有-m32的情况下编译加载器,现在dlerror正在说:/home/nafees/Desktop/temp/lib.so: wrong ELF class: ELFCLASS32