ELF共享库可移植性



假设我有一个ELF格式的共享库,它只导出一个具有确定调用约定的确定符号(入口点),并且根本不导入任何符号。

我能在不同的UNIX系统(Linux, FreeBSD, Solaris)中打开/dlsym/dlclose这个共享库吗?

我能在不同的UNIX系统(Linux, FreeBSD, Solaris)中打开/dlsym/dlclose这个共享库吗?

假设你的库是完全自包含的,不调用任何外部例程,也不发出任何系统调用…答案仍然是否定的。

在ELF头e_ident[EI_OSABI]字节中,您将有ELFOSABI_GNU, ELFOSABI_FREEBSDELFOSABI_SOLARIS中的一个。加载程序将(或至少应该)拒绝尝试dlopen为"错误的"操作系统构建的库。

然而,如果你修补了一个字节来匹配当前的操作系统,那么dlopen可能会工作。

不,ELF加载器和ELF文件的约定在不同的操作系统中是不同的,以及用于与内核交互的系统调用。

可以编辑文件以更改加载器,以便FreeBSD或Solaris加载器接受它,并且如果您只使用最最小的subse, 可能会加载,但您不太可能从中获得很多东西,除非它只是一堆纯函数。

最新更新