"添加"函数到共享对象?

时间:2018-01-04 19:04:02

标签: c++ linker shared-libraries

我有一个封闭的源代码应用程序,其中包含一个动态加载来自共享对象libclosedsource.so的符号的解释器,这是一个封闭的源代码。我想添加一些我自己的API扩展。现在有问题的应用程序使用dlopen加载文件,所以我基本上可以用我想要的库替换libclosedsource.so。但是,该库应包含原始导出的符号的超集。

我的问题:是否可以将原始共享对象重命名为libclosedsource-orig.so并创建我自己的libclosedsource.so,以便在加载libclosedsource.so时,应用程序将能够看到在libclosedsource中导出的符号 - orig.so?

我的假设是,不幸的是,答案是否定的,因为符号加载似乎不具有传递性。我对其他任何建议都持开放态度。

编辑:原始库包含大约300个函数。

2 个答案:

答案 0 :(得分:1)

如果你知道所有导出函数的签名,这很容易,虽然相当繁琐,只需重新实现所有函数并将它们传递给原始库的调用。

另外,请查看:https://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries

答案 1 :(得分:1)

要添加到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的调用重定向到它。