Exim 无法启动——加载查找模块 mysql.so 时出错

Exim 无法启动——加载查找模块 mysql.so 时出错

我必须更改服务器上 MySQL 的 root 密码。Exim 也使用 MySQL 来管理用户等。

我不认为 Exim/Dovecot 使用过该密码,但现在情况不妙,我确信它们是相关的。

当我尝试启动 Exim 时:

Starting exim: Error loading mysql.so: /usr/lib64/exim/4.72-6.6.amzn1/lookups/mysql.so: undefined symbol: mysql_servers
2014-09-13 19:13:22 Error loading lookup module mysql.so: NULL

运行服务--status-all让我

exim dead but subsys locked

我已经检查了 /etc/ 中的 /eximdisable,但什么也没有。

磁盘空间已使用 85%,文件句柄已使用 7%。

答案1

我最近看到了这种情况。我为朋友在基于 CentOS 6 的 Amazon EC2 服务器上构建了一些 Exim 4.84 rpm(您没有说明您正在运行哪个版本的 Amazon 服务器)。我不得不重新配置 spec 文件以将 mysql 模块直接编译并链接到 Exim 二进制文件中,而不是使其成为可加载模块。我不知道为什么这个全局变量对 Amazon 服务器上的 mysql 可加载模块不可见,因为它在我曾经构建过 Exim 的所有其他架构上都是可见的。

我的第一直觉是,这与 gcc 版本以及它如何处理优化标志有关。但没有任何证据或事实支持这一点,这只是一种直觉。

答案2

事实证明,这与 gcc 版本或优化失败无关。相反,这是 exim 二进制文件的不完整编译/链接。gcc 有一个标志 (-rdynamic),用于告诉链接器导出符号,以便动态加载的模块可见。在构建 mysql.so 时必须将此标志传递给 gcc构建 Exim 二进制文件时。

如果此 RPM 基于 Fedora exim.spec 文件(我的就是),我发现有些补丁在 中设置了 LFLAGS 变量Local/Makefile,但 make 命令会在命令行上覆盖 LFLAGS。只需将您要设置 LFLAGS 的内容移动到 Local/Makefile 中,然后将其从 make 命令中删除:

# This used to be set on the make commandline
echo 'LFLAGS+=-pie' >> Local/Makefile
#
# Then further down where the make command is,
# remove the LFLAGS= setting, leaving only:
make _lib=%{_lib} FULLECHO=

另外,很可能您需要做的就是在末尾添加Local/Makefile

LFLAGS+=-rdynamic -ldl
# _OR_
EXTRALIBS_EXIM+=-rdynamic -ldl

更多详细信息请参见此处: https://stackoverflow.com/a/482556/611911

注意:虽然你接受了我提供的第一个答案,但它实际上只是说“是的,我也遇到了这个问题。”这个答案实际上解决了这个问题。:-)

答案3

Exim无法加载,mysql.so因为尚未构建。您必须确保至少已 mysql-client正确安装。

相关内容