如何静态编译lighttpd模块

how to compile lighttpd modules statically

我目前已经从源代码编译了 lighttpd

./configure --prefix=/home/lighttpd \
--without-pcre \
--without-zlib \
--without-bzip2

我也尝试了 -enable-static --disable-shared 选项,但模块仍然从 lib 目录加载

我想在单个二进制文件中编译所有 lighttpd 模块,而不是从 lib 目录加载,该怎么做?

用标志 -DLIGHTTPD_STATIC 编译它。如果 gcc 会警告您有关语法的信息,请强制将 gcc 解释为 C99 标准:

make CFLAGS=-DLIGHTTPD_STATIC -std=c99

您还必须更改 src/Makefile.in 由 configure 生成以添加您想要包含的模块。具体来说,添加到 am__liblightcomp_la_SOURCE_DIST、am__lighttpd_SOURCES_DIST 和 common_src:

mod_access.c mod_staticfile.c

并添加对象。 到 am__objects_1 和 am__objects_2

mod_access.$(OBJEXT) mod_staticfile.$(OBJEXT)

如果 src/plugin-static.h 文件不可用,更改 src/plugin.c 文件,找到行 #include "plugin-static.h",注释并在下面添加:

PLUGIN_INIT(mod_access)
PLUGIN_INIT(mod_staticfile)

交叉发布到 https://redmine.lighttpd.net/boards/3/topics/6615

Lighttpd 可以使用 SCons 或使用 make 静态构建。简而言之:

缺点:
$ scons -j 4 build_static=1 build_dynamic=0 prefix=/custom/inst/path install

制作:

# 编辑 src/Makefile.am 并在 'if LIGHTTPD_STATIC' 下的部分中,更新 lighttpd_SOURCES 每个要包含在静态构建中的模块,或者只使用已经存在的整个列表那里

$ LIGHTTPD_STATIC=yes ./configure -C --enable-static=yes
$制作

https://redmine.lighttpd.net/boards/3/topics/5912

中有更多详细信息

[编辑] 要使用 'make' 静态构建,请使用 lighttpd git 主分支或 lighttpd 1.4.40+

lighttpd 的文档解释说,使用 build_static 只会导致它用自己的模块(mod_*.so 文件)静态 linked。它仍然会动态 link 外部依赖项(/lib*/* 中的依赖项)。

如果您没有混淆这些,关于您的体验:

I also tried -enable-static --disable-shared option, but modules still loading from lib directory

你想要的只是将这些模块静态包含在 lighttpd 二进制文件中,那么其他答案应该是正确和有效的。

但是,如果你想要一个单一的二进制文件,那么就没有外部动态依赖。然后你需要同时使用 scons 并将 build_static=1 替换为 build_fullstatic=1Makefile 安装程序没有此选项。


build_static=1

scons -j 4 build_static=1 build_dynamic=0

使用ldd显示需要哪些动态库:

ldd sconsbuild/static/build/lighttpd
    linux-vdso.so.1 (0x00007fff0478f000)
    libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f760191e000)
    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f76018e4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f76016bc000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7601a5a000)

PS: 如果你构建了一个共享版本,mod_*.so 文件仍然不会出现在这里,因为它们是从内部延迟加载的根据您的配置文件执行 lighttpd


build_fullstatic=1

scons -j 4 build_fullstatic=1 build_dynamic=0
ldd sconsbuild/fullstatic/build/lighttpd
    not a dynamic executable

这就是我想你想看到的。