web-dev-qa-db-ja.com

.debパッケージのアーキテクチャを検出する方法は?

リポジトリには、32ビットであると宣言されているが、64ビットのバイナリをインストールする.debパッケージがあります。これは、リポジトリから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 showapt-cache policyの両方を試し、.debファイルにdpkg -Iを試しましたが、それらはすべて32ビットを報告します。

パッケージのメタ情報(これは私が試したコマンドが実行したものだと思います)にアクセスすることを除いて、含まれている実行可能ファイルの実際のアーキテクチャを見つける機会はありますか?.

2
Byte Commander

スクリプトを作成します。私の例では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
4
A.B.

DEBパッケージは、非常に具体的な内容の単なるアーカイブです。任意のアーカイブマネージャー(ファイルローラーなど)で開くことができ、コンテンツは/に空であるかのようにレイアウトされます。必要なことは、バイナリを見つけてそのファイルタイプを照会することだけです。通常、これは必要ありません-ファイル名にi386が含まれている場合、i386である必要があります。あなたのケースは間違いなく異常なので、パッケージメンテナーがそれをどのようにさせているのでしょうか。

1