想象一下,我有一个ELF格式的共享库,它只导出一个具有确定调用约定的确定符号(入口点),并且根本不导入任何符号。
我可以在不同的UNIX风格(Linux,FreeBSD,Solaris)中使用dlopen / dlsym / dlclose这个共享库吗?
答案 0 :(得分:2)
我可以在不同的UNIX风格(Linux,FreeBSD,Solaris)中使用dlopen / dlsym / dlclose这个共享库吗?
假设你的图书馆是完全独立的,不会调用任何外部例程,也不会发出任何系统调用...答案仍然是否定的。
在ELF标头e_ident[EI_OSABI]
字节中,您将拥有ELFOSABI_GNU
,ELFOSABI_FREEBSD
或ELFOSABI_SOLARIS
之一。加载器将(或至少应该)拒绝为{“1}}为”错误“操作系统构建的库的尝试。
但是,如果您修补一个字节以匹配当前操作系统,那么dlopen
可能会有效。
答案 1 :(得分:0)
不,ELF加载器和ELF文件的约定在操作系统和用于与内核交互的系统调用之间是不同的。
你可以编辑文件以更改加载程序,以便FreeBSD或Solaris加载程序接受它,如果你只使用最小的subse,可能加载但是它& #39;你不太可能从中得到很多东西,除非它只是一大堆纯粹的功能。