我有一个封闭的源代码应用程序,其中包含一个动态加载来自共享对象libclosedsource.so的符号的解释器,它是闭源的。我想添加一些我自己的API扩展。现在有问题的应用程序使用dlopen加载文件,所以我基本上可以用我想要的库替换libclosedsource.so。但是,该库应包含原始导出的符号的超集。
我的问题:是否可以将原始共享对象重命名为libclosedsource-orig.so并创建我自己的libclosedsource.so,以便在加载libclosedsource.so时,应用程序将能够看到libclosedsource-orig.so中导出的符号?
不幸的是,我的假设是,答案是否定的,因为符号加载似乎不是传递性的。我愿意接受任何其他建议来完成这项工作。
编辑:原始库包含大约300个函数。
要添加到SoronelHaetir答案,可以通过Implib.so自动包装对原始库的调用:
$ implib-gen.py libclosedsource-orig.so
$ gcc new-code.c libclosedsource-orig.tramp.S libclosedsource-orig.init.c -shared -fPIC -o libclosedsource.so
请注意,您不需要libclosedsource-orig.so
的标头,只需要二进制文件本身。 libclosedsource.so
将在启动时加载libclosedsource-orig.so
并将调用重定向到原始API。
如果您知道所有导出函数的签名,这将很容易,但相当繁琐,只需重新实现所有函数并将它们传递给原始库的调用。
另外,看看:https://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries