ELF 共享库可移植性

ELF shared library portability

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

我能否在不同的 UNIX 风格(Linux、FreeBSD、Solaris)之间 dlopen/dlsym/dlclose 这个共享库?

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

可以 编辑文件以更改加载程序,以便 FreeBSD 或 Solaris 加载程序接受它,如果您只使用最小的子集,它 可能 加载,但你不太可能从中得到很多,除非它只是一堆纯函数。

Will be I able to dlopen/dlsym/dlclose this shared library among different UNIX flavors(Linux, FreeBSD, Solaris)?

假设您的库完全 self-contained 并且不调用任何外部例程,也不发出任何系统调用...答案仍然是否定的。

在 ELF header e_ident[EI_OSABI] 字节中,您将拥有 ELFOSABI_GNUELFOSABI_FREEBSDELFOSABI_SOLARIS 之一。加载程序将(或至少应该)拒绝尝试 dlopen 为 "wrong" OS.

构建的库

但是,如果您修补那个字节以匹配当前的 OS,那么 dlopen 可能会起作用。