我有一个封闭的源应用程序,其中包含一个解释器,该解释器可从共享对象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
的 header ,而只需要二进制文件本身。 libclosedsource.so
将在启动时加载libclosedsource-orig.so
,并将调用重定向到原始API。关于c++ - “Adding”函数可以共享对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48101900/