如何检测 .deb 包的架构?

如何检测 .deb 包的架构?

存储库中有一个 .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

相关内容