将共享对象中的引用移除到另一个共享对象

时间:2011-05-29 20:24:00

标签: linux shared-libraries

我想将共享对象中的引用移除到另一个共享对象的符号,因为引用的对象是GPL,并且我不想在该许可下发布我的代码。 (我不认为我的代码使用了引用对象提供的符号。)在Linux上执行此操作需要执行哪些步骤?我并不沉浸在这项技术中,如果你提供命令,它会有所帮助。另一种方法会更好吗?以某种方式创建一个替换引用对象的存根对象会更好吗?

编辑1:我正在使用PyInstaller构建一个自包含的存档,其中包含我编写的代码的二进制文件以及代码所需的所有库以及这些库所需的所有库。这些库是构建系统中已存在的共享对象。放弃PyInstaller并重新编译所有内容以便GPL库不被链接将是太多的工作。

1 个答案:

答案 0 :(得分:3)

在Linux上,可执行文件或库直接引用的唯一库是libc.sold-linux.solinux-gate.so,以及在编译器命令行上显式请求的任何内容。因此,只需从编译器命令行中删除它们即可删除这些引用。

请注意,很多时候,pkg-config脚本将在查询链接器标志时返回所有间接依赖项以及直接依赖项。您可以手动删除不必要的依赖项,也可以将-Wl,--as-needed标志传递给链接器,以指示它自动删除对共享库的不必要的直接引用。

至于pyinstaller捆绑,请记住,通过中间库间接链接GPL的库已经是一个灰色区域;如果您另外将它们合并到一个文件中,这可能不算作“仅仅聚合”,并且可能无法避免GPL限制。另请注意,GPL从未提及“链接”;这完全是关于衍生作品。我不是律师,这不是法律建议,但是当没有使用符号时,仅添加或删除GPL库的NEEDED条目似乎不太可能影响您是否违反GPL,当GPL本身从来没有提到这样的事情。