macOS 10.15环境下启动EDB版PostgreSQL 9.5报libpq.5.dylib加载错误咨询
问题核心根因
这个报错是macOS 10.15引入的硬化运行时(Hardened Runtime)安全机制与PostgreSQL 9.5版本EDB安装包的兼容冲突,对应报错信息的直接触发点有两个:
- 旧版本PG的二进制、动态库未适配新系统的代码签名校验规则,系统拦截了动态库的内存映射(对应报错里的
code signing blocked mmap()提示) - 硬化运行时规则禁止签名程序通过相对路径加载动态库,同时跨目录软连接引用会触发系统文件校验失败(对应报错里的
file system relative paths not allowed in hardened programs、stat() failed with errno=1提示)
分步排障修复步骤
- 第一步:移除文件隔离属性,解除系统的隔离拦截
macOS会给安装包解压的文件自动添加隔离标记,会进一步放大签名校验的拦截规则,执行递归移除命令:sudo xattr -r -d com.apple.quarantine /Library/PostgreSQL/9.5 - 第二步:为PG程序补做本地adhoc代码签名
不需要付费苹果开发者证书,本地用临时签名覆盖原有无效的旧签名,让系统允许程序映射动态库:sudo codesign --force --deep --sign - /Library/PostgreSQL/9.5/bin/pg_ctl sudo codesign --force --deep --sign - /Library/PostgreSQL/9.5/bin/postgres sudo codesign --force --deep --sign - /Library/PostgreSQL/9.5/bin/psql sudo codesign --force --deep --sign - /Library/PostgreSQL/9.5/lib/*.dylib sudo codesign --force --deep --sign - /Library/PostgreSQL/9.5/lib/postgresql/*.so - 第三步:修正动态库的相对路径引用为绝对路径
系统硬化规则不允许相对路径加载动态库,需要把pg_ctl等可执行文件内部对libpq的相对引用,修改为PG安装目录内的绝对路径,同时避开软连接跳转的问题:
先确认原有路径引用:otool -L /Library/PostgreSQL/9.5/bin/pg_ctl
执行路径替换命令,把相对路径@loader_path/../lib/libpq.5.dylib替换为安装目录下的真实文件路径:
这里直接指向真实的sudo install_name_tool -change @loader_path/../lib/libpq.5.dylib /Library/PostgreSQL/9.5/lib/libpq.5.8.dylib /Library/PostgreSQL/9.5/bin/pg_ctl sudo install_name_tool -change @loader_path/../lib/libpq.5.dylib /Library/PostgreSQL/9.5/lib/libpq.5.8.dylib /Library/PostgreSQL/9.5/bin/postgres sudo install_name_tool -change @loader_path/../lib/libpq.5.dylib /Library/PostgreSQL/9.5/lib/libpq.5.8.dylib /Library/PostgreSQL/9.5/bin/psqllibpq.5.8.dylib实体文件,而不是软连接,就能解决软连接跳转带来的stat校验失败问题。 - 第四步:修正目录权限
PG服务默认以daemon用户身份运行,需要保证安装目录下data文件夹的归属权限正确,避免启动时的权限拦截:sudo chown -R daemon:daemon /Library/PostgreSQL/9.5/data - 第五步:验证启动
重新执行启动命令即可正常运行:cd /Library/PostgreSQL/9.5/bin sudo ./pg_ctl -D /Library/PostgreSQL/9.5/data start
注意事项
- 不要依赖
/usr/local/lib下指向PG目录的libpq软连接,硬化运行时的程序不允许跨非信任目录加载动态库,所有依赖引用必须限定在PG自身的安装目录范围内 - 后续如果系统升级,需要重新执行一遍签名命令,因为系统安全策略升级后可能会重置本地签名的信任规则
内容的提问来源于stack exchange,提问作者Pychong
相关产品推荐
相关产品推荐

