RISC-V架构静态编译lighttpd运行时找不到mod_indexfile插件如何解决?
问题排查步骤
- 确认
plugin-static.h修改时机
必须在执行configure命令前修改src/plugin-static.h,如果是运行完configure后才修改的头文件,已生成的Makefile不会将新增插件的编译单元链入最终二进制。修改完成后先执行make clean distclean清空所有缓存,再重新走configure、make、install流程。 - 检查configure编译配置输出
运行configure命令后,查看输出的「Enabled modules」列表,确认mod_indexfile处于启用状态。你当前的configure参数禁用了pcre、zlib等组件,确认这些依赖的禁用没有连带禁用mod_indexfile(mod_indexfile无额外依赖,默认会启用)。 - 检查lighttpd运行配置
静态编译内置的插件不需要在lighttpd.conf的server.modules列表中重复声明,如果你的配置里仍然保留了server.modules += ("mod_indexfile")这类加载语句,程序会尝试从磁盘加载动态插件.so文件,你禁用了shared编译自然找不到对应文件,删掉所有静态内置插件的动态加载配置即可。 - 排查链接器符号丢弃问题
静态链接时链接器可能会自动丢弃它认为未被引用的符号,你可以在LDFLAGS中增加-Wl,--whole-archive参数强制保留所有插件符号,调整后的LDFLAGS参考:LDFLAGS="-Wl,--wrap=socket -Wl,--whole-archive -static-libstdc++ -static-libgcc -L/home/lighttpd/src -L/home/riscv64-linux-musl-cross/riscv64-linux-musl/lib/ -Wl,--no-whole-archive" - 验证符号是否编入二进制
编译完成后用交叉编译工具链的nm命令验证符号是否存在:
有输出则说明插件已经编入二进制,问题出在运行配置环节;无输出则说明编译链接阶段就没有把插件加进去,回到前两步排查编译配置。/home/riscv64-linux-musl-cross/bin/riscv64-linux-musl-nm /home/lighttpd/install/sbin/lighttpd | grep mod_indexfile
内容的提问来源于stack exchange,提问作者ballsmahoney
相关产品推荐
相关产品推荐

