共享对象未加载,在 dlopen 上出现分段错误
Shared Object not loading, gives segmentation fault on dlopen
我有很多代码是在 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
尝试使用 loadLibrary.
而不是 dlopen
更新:
使用 -fPIC 标志进行编译 lib.d:
dmd -m32 -fPIC -共享 lib.d
我有很多代码是在 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
尝试使用 loadLibrary.
而不是 dlopen更新:
使用 -fPIC 标志进行编译 lib.d: dmd -m32 -fPIC -共享 lib.d