"Adding" 功能共享对象?
"Adding" functions to a shared object?
我有一个闭源应用程序,其中包含一个解释器,可以从共享对象 libclosedsource.so 中动态加载符号,它是闭源的。我想添加一些我自己的 API 扩展。现在有问题的应用程序使用 dlopen 加载文件,所以我基本上可以用我想要的任何库替换 libclosedsource.so。但是,该库应该包含原始导出的符号的超集。
我的问题:是否可以将原始共享对象重命名为 libclosedsource-orig.so 并创建我自己的 libclosedsource.so,以便在加载 libclosedsource.so 时应用程序能够查看在 libclosedsource-orig.so?
中导出的符号
我的假设是,不幸的是,答案是否定的,因为符号加载似乎不是可传递的。我愿意接受任何其他建议来完成这项工作。
编辑:原始库包含大约 300 个函数。
如果您知道所有导出函数的签名,这将很容易,尽管相当乏味,只需重新实现所有函数并将它们传递给对原始库的调用。
另外,看看:https://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries
要添加到 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
的 headers,只需要二进制文件本身。 libclosedsource.so
将在启动时加载 libclosedsource-orig.so
并将对原始 API 的调用重定向到它。
我有一个闭源应用程序,其中包含一个解释器,可以从共享对象 libclosedsource.so 中动态加载符号,它是闭源的。我想添加一些我自己的 API 扩展。现在有问题的应用程序使用 dlopen 加载文件,所以我基本上可以用我想要的任何库替换 libclosedsource.so。但是,该库应该包含原始导出的符号的超集。
我的问题:是否可以将原始共享对象重命名为 libclosedsource-orig.so 并创建我自己的 libclosedsource.so,以便在加载 libclosedsource.so 时应用程序能够查看在 libclosedsource-orig.so?
中导出的符号我的假设是,不幸的是,答案是否定的,因为符号加载似乎不是可传递的。我愿意接受任何其他建议来完成这项工作。
编辑:原始库包含大约 300 个函数。
如果您知道所有导出函数的签名,这将很容易,尽管相当乏味,只需重新实现所有函数并将它们传递给对原始库的调用。
另外,看看:https://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries
要添加到 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
的 headers,只需要二进制文件本身。 libclosedsource.so
将在启动时加载 libclosedsource-orig.so
并将对原始 API 的调用重定向到它。