共享对象未加载,在dlopen上给出分段错误

时间:2016-10-08 06:39:30

标签: shared-libraries d 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

1 个答案:

答案 0 :(得分:3)

而不是dlopen尝试使用loadLibrary

更新:

使用-fPIC标志编译lib.d: dmd -m32 -fPIC -shared lib.d