web-dev-qa-db-fra.com

Comment détecter l'architecture d'un paquet .deb?

Il existe un package .deb dans un référentiel déclaré comme étant 32 bits, mais installe des fichiers binaires 64 bits. C'est le cas à la fois pour l'installation via apt-get à partir du référentiel, ainsi que pour le téléchargement du fichier .deb et l'exécution de dpkg -i.

Si j'installe le fichier à essayer, il met à niveau/écrase mon application existante en 32 bits et je ne peux plus l'exécuter (sur 15.04 32 bits Ubuntu). Lorsque cela s'est produit pour la première fois, j'ai cherché dans l'exécutable installé avec which et vérifié son type avec file, ce qui s'est avéré être un fichier binaire ELF de 64 bits:

$ file qtox
qtox: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

En attendant que les responsables résolvent le problème, comment puis-je déterminer quelle architecture un package (à partir d'un référentiel ou d'un fichier .deb) contient?

J'ai essayé à la fois apt-cache show et apt-cache policy pour la version du référentiel et dpkg -I pour le fichier .deb, mais tous indiquent 32 bits, ce qui est faux.

Y a-t-il une chance de trouver la véritable architecture pour laquelle les exécutables contenus sont créés, sauf en accédant aux méta-informations du paquet (je pense que c'est ce que les commandes que j'ai essayées ont fait?), Ce qui ne convient évidemment pas.

2
Byte Commander

Créer un script, dans mon exemple 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

Usage

./foo <deb_file>

Exemple

% ./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.

Un paquet DEB est juste une archive avec un contenu très spécifique. Vous pouvez l'ouvrir dans le gestionnaire d'archives de votre choix (tel que File Roller ou autre) et son contenu est présenté comme si vous le vidiez dans /. Tout ce que vous avez à faire est de localiser un binaire et d’interroger son type de fichier. Ce n'est généralement pas nécessaire - si le nom du fichier contient i386, il devrait s'agir de i386. Votre cas est définitivement anormal, alors je me demande comment les responsables de l’emballage ont laissé cela se produire.

1
Stephen Angelico