存储库中有一个 .deb 包,声明为 32 位,但安装的是 64 位二进制文件。无论是从apt-get
存储库安装,还是下载 .deb 文件并运行,都是这种情况dpkg -i
。
如果我安装该文件进行尝试,它会升级/覆盖我现有的 32 位应用程序,并且我无法再运行它(在 15.04 32 位 Ubuntu 上)。当第一次发生这种情况时,我用 搜索已安装的可执行文件,which
并用 检查其类型file
,结果证明它是一个 64 位 ELF 二进制文件:
$ file qtox
qtox: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
因此,当我等待维护人员修复该问题时,我如何确定包(来自存储库或.deb 文件)包含哪种架构?
我尝试了apt-cache show
存储apt-cache policy
库版本和dpkg -I
.deb 文件,但它们都报告 32 位,这是错误的。
除了通过访问包的元信息(我想这是我尝试的命令所做的?)之外,是否有机会找到所包含的可执行文件的真实体系结构,但这显然不适合。
答案1
在我的示例中创建一个脚本foo
#!/bin/bash
# Create a temporary folder in /tmp
dir=$(mktemp -d)
# Extract the deb file
dpkg -x "$1" "$dir"
printf "\n%s\n\n" "$1"
# Show the package architecture information
dpkg --info $1 | \
awk '/Architecture/ {printf "defined dpkg architecture is:\t%s\n", $2}'
# Show the executable format via find and awk for ELF
find $dir -type f -exec file -b {} \; | \
sort -u | \
awk '/ELF/ {printf "executable format is: \t\t%s\n", $0}'
rm -rf "$dir"
exit 0
用法
./foo <deb_file>
例子
% ./foo qtox_1.1\~git20150707.cfeeb03-97_i386.deb
qtox_1.1~git20150707.cfeeb03-97_i386.deb
defined dpkg architecture is: i386
executable format is : ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
答案2
DEB 软件包只是一个内容非常具体的档案。您可以在任何您喜欢的档案管理器(例如 File Roller 或其他)中打开它,内容的布局就像您将其清空一样/
。您需要做的就是找到一个二进制文件并查询其文件类型。这通常不是必需的 - 如果文件名中包含 i386,则应该是 i386。您的情况肯定是不正常的,所以我想知道软件包维护者是如何让这种情况发生的。
答案3
每个 deb 包都声明了一个体系结构,例如“i386”或“all”。然而,这只是一个声明,它可能被声明为错误(出于某种原因而故意声明,或者例如由于某些包构建脚本中的错误)。
您可以通过以下方法来验证真实的封装架构:
# verify, if package supports multiple architectures (and possibly has some bug):
dpkg --print-foreign-architectures package.deb
# unpack and check executables inside:
dpkg --unpack package.deb
dpkg --contents package.deb |grep ^-rwxr-xr-x |awk "{ print \$6 }" |grep -v /etc/
# and then check a few random unpacked executables using:
file ./usr/bin/some-executable