如果我静态地从源代码编译一个 PHP 安装,并且其中包含大量扩展,libphp5.so 是否包含任何依赖项?

如果我静态地从源代码编译一个 PHP 安装,并且其中包含大量扩展,libphp5.so 是否包含任何依赖项?

基本上,我只是想知道我是否可以将 libphp5.so 文件拖放到没有 PHP 的另一台服务器上,并将 PHP 的功能和所有扩展静态编译到其中。(从源代码编译,带有一堆扩展)

我尝试在 so 文件上使用 ld 工具(在我的服务器上),但它只是吐出一堆未定义的引用。由于它是一个有效的安装,所以这些引用无关紧要。

编辑:

我现在意识到我使用的是ld而不是ldd。现在我得到了依赖项列表。我猜我需要所有这些文件,对吗?所以我的问题是,如果我以递归方式获取所有共享对象文件并将它们放在目标服务器上的相同位置(可能通过自定义 RPM),PHP 是否可以在没有正式安装 PHP 的情况下运行新服务器?

我是否缺少了 ldd 未找到的任何隐藏依赖项?

答案1

.so 库是共享库 - 与静态库完全相反。如果您静态编译 PHP 安装,您将得到一个可能名为“php”的单个(非常大的)可执行文件,但没有 .so 文件。

我认为“静态”编译 .so 文件是不可能的(或者至少是一个非常糟糕的主意)。原因是您将有效地将数百甚至数千个函数复制到 .so 文件中,这不仅会使它变得庞大,而且还会在加载库时导致错误。例如,如果应用程序(例如 Web 服务器)加载包含 strcpy() 函数的标准 C 库,然后加载也包含 strcpy() 函数的“静态”.so 文件,则可能会发生冲突。您可以通过小心地仅导出必要的符号或在应用程序中使用 dlopen() 来解决这个问题,但充其量您最终会得到一个非常大的 .so 文件,这会浪费大量内存。

您可以做的是ldd挑选出运行所有扩展所需的所有 .so 文件,然后将它们全部放在与 .so 文件相同的文件夹中。如果您在LD_LIBRARY_PATH运行应用程序之前将环境变量设置为该目录,它应该会从该文件夹中获取 PHP 及其所有依赖项。这不会为您提供神奇的单文件方法,但至少可以让您将所有内容包含在一个文件夹中。

相关内容