强制去掉Qt的运行环境信息
基于Qt6开发的应用程序会依赖libQt6Core.so.6,动态库so文件中包含有运行环境信息,包含有运行所需的linux kernel最低版本,可通过objdump工具查看。在Docker环境中,glibc的版本可以用FROM自定义环境,但linux kernel版本只能用宿主机的,就造成Qt6开发的程序在CentOS7等老旧操作系统下的Docker中运行不起来,往往会报(libQt6Core.so.6: cannot open shared object file)的错误信息。解决的方案是去掉so库的.note.ABI-tag。
1、查看.note.ABI-tag
objdump -s -j .note.ABI-tag libQt6Core.so.6
2、去掉.note.ABI-tag
strip --remove-section=.note.ABI-tag libQt6Core.so.6
可以看到处理后的so库已经不包含运行环境信息了,在较老旧的linux上可成功运行。
附:查看程序的elf文件头信息
readelf -S libQt6Core.so.6 #Display the sections' header readelf -h libQt6Core.so.6 #Display the ELF file header
.note.ABI-tag
每个可执行文件都应包含一个名为.note.ABI-tag的SHT_NOTE类型的节。
本部分的结构为ELF规范中记录的注释部分。该部分必须至少包含以下条目:前面的部分为类型、名称,名称字段包含字符串“ GNU”,数据为单字节类型。后续是 desc 字段,数据为多字节类型,机器采用小字节序(LITTLE-ENDIAN)存储,低位在前,desc字段的第一个64位字必须为0(这表示Linux可执行文件),desc字段的第二、第三和第四64位字包含最早的兼容内核版本。例如上图的3个字分别是3、17和0,则表示最早兼容3.17.0内核。