J'ai créé un exécutable compilé croisé. Je veux trouver la dépendance de la bibliothèque de l'exécutable. J'utilise ubuntu natty et la chaîne d'outils arm-linux-gnueabi installée, qui ne contient pas ldd. Existe-t-il un outil permettant de visualiser la dépendance de la bibliothèque arm exécutable sous linux?.
C’est un peu kluge, mais c’est la meilleure solution que j’ai pu trouver, et cela fonctionne vraiment très bien pour une utilisation basique - enregistrez simplement ce script sous le nom "arm-none-linux-gnueabi-ldd" avec vos autres outils croisés.
#!/bin/sh
arm-none-linux-gnueabi-readelf -a $1 | grep "Shared library:"
Vous pouvez également utiliser objdump et pour simplement sauvegarder et rechercher la fraction d’en-tête du binaire. Cela peut vous faire économiser quelques millisecondes ...
#!/bin/sh
arm-none-linux-gnueabi-objdump -x $1 | grep NEEDED
Voici une autre option. Vous pouvez définir la variable d’environnement LD_TRACE_LOADED_OBJECTS sur n’importe quelle valeur, disons 1, puis vous exécutez simplement l’exécutable. Le résultat en sortie doit correspondre à ses dépendances dynamiques.
Comme déjà dit, par sa conception, ldd
ne peut être exécuté que sur la cible . Cependant, il est possible d'imiter le comportement ldd
à l'aide de readelf
. Un script appelé xldd
a été développé dans le projet crosstool-ng
. Une version indépendante de ce script est disponible ici:
https://Gist.github.com/jerome-pouiller/c403786c1394f53f44a3b61214489e6f
J'ai trouvé cela et j'espère que cela pourra aider beaucoup de gens qui recherchent encore une vraie solution LDD. ldd est juste un script supportant la bibliothèque ld-linux. Alors, pourquoi ne pas créer votre propre script ldd? Vous devez d’abord trouver la bibliothèque ld-linux sur votre système, qui devrait être disponible. Dans mon cas, il s’agit de /lib/ld-linux-armhf.so.3, donc je mets cela dans RTLDLIST comme vous pouvez le voir dans le script ci-dessous.
Et mettez ce script dans votre appareil ou votre tableau et vous pouvez avoir ldd, ce qui est très pratique pour trouver des bibliothèques de personnes à charge pour un exécutable.
Bonne chance!
#! /bin/bash
# Copyright (C) 1996-2011, 2012 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, write to the Free
# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA.
# This is the `ldd' command, which lists what shared libraries are
# used by given dynamically-linked executables. It works by invoking the
# run-time dynamic linker as a command and setting the environment
# variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
# We should be able to find the translation right at the beginning.
TEXTDOMAIN=libc
TEXTDOMAINDIR=/usr/share/locale
RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-armhf.so.3"
warn=
bind_now=
verbose=
while test $# -gt 0; do
case "$1" in
--vers | --versi | --versio | --version)
echo 'ldd (Ubuntu EGLIBC 2.15-0ubuntu10.3) 2.15'
printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
" "2012"
printf $"Written by %s and %s.
" "Roland McGrath" "Ulrich Drepper"
exit 0
;;
--h | --he | --hel | --help)
printf $"Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
-u, --unused print unused direct dependencies
-v, --verbose print all information
"
printf $"For bug reporting instructions, please see:
%s.
" "<http://www.debian.org/Bugs/>"
exit 0
;;
-d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
--data-rel | --data-relo | --data-reloc | --data-relocs)
warn=yes
shift
;;
-r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
--function | --function- | --function-r | --function-re | --function-rel | \
--function-relo | --function-reloc | --function-relocs)
warn=yes
bind_now=yes
shift
;;
-v | --verb | --verbo | --verbos | --verbose)
verbose=yes
shift
;;
-u | --u | --un | --unu | --unus | --unuse | --unused)
unused=yes
shift
;;
--v | --ve | --ver)
echo >&2 $"ldd: option \`$1' is ambiguous"
exit 1
;;
--) # Stop option processing.
shift; break
;;
-*)
echo >&2 'ldd:' $"unrecognized option" "\`$1'"
echo >&2 $"Try \`ldd --help' for more information."
exit 1
;;
*)
break
;;
esac
done
nonelf ()
{
# Maybe extra code for non-ELF binaries.
return 1;
}
add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
add_env="$add_env LD_VERBOSE=$verbose"
if test "$unused" = yes; then
add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
fi
# The following use of cat is needed to make ldd work in SELinux
# environments where the executed program might not have permissions
# to write to the console/tty. But only bash 3.x supports the pipefail
# option, and we don't bother to handle the case for older bash versions.
if x=`set -o` && test "$x" != "${x#*pipefail}" && set -o pipefail ; then
try_trace() {
eval $add_env '"$@"' | cat
}
else
try_trace() {
eval $add_env '"$@"'
}
fi
case $# in
0)
echo >&2 'ldd:' $"missing file arguments"
echo >&2 $"Try \`ldd --help' for more information."
exit 1
;;
1)
single_file=t
;;
*)
single_file=f
;;
esac
result=0
for file do
# We don't list the file name when there is only one.
test $single_file = t || echo "${file}:"
case $file in
*/*) :
;;
*) file=./$file
;;
esac
if test ! -e "$file"; then
echo "ldd: ${file}:" $"No such file or directory" >&2
result=1
Elif test ! -f "$file"; then
echo "ldd: ${file}:" $"not regular file" >&2
result=1
Elif test -r "$file"; then
RTLD=
ret=1
for rtld in ${RTLDLIST}; do
if test -x $rtld; then
verify_out=`${rtld} --verify "$file"`
ret=$?
case $ret in
[02]) RTLD=${rtld}; break;;
esac
fi
done
case $ret in
0|2)
try_trace "$RTLD" "$file" || result=1
;;
1|126)
# This can be a non-ELF binary or no binary at all.
nonelf "$file" || {
echo $" not a dynamic executable"
result=1
}
;;
*)
echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
exit 1
;;
esac
else
echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
result=1
fi
done
exit $result
# Local Variables:
# mode:ksh
# End:
J'ai trouvé une solution en exécutant [Sourceware.Bugzilla]: Bug 16628 - Segfault après un binaire sans la bibliothèque pthread dlopen () liée à pthread tout en travaillant sur un projet (ce qui impliquait le portage de C++ code sur BRAS).
J'utilise Ubtu 16.04, et pour ARM outils de compilation croisés j'ai installé g ++ - 4.9-arm-linux-gnueabihf (et dépendances, ainsi que m'a forcé à désinstaller g ++ - multilib (et dépendances)). Pour tester (exécuter) les exécutables, j'ai installé QEMU (qemu-user-static).
Selon [man7]: LDD (1) (qui est juste un script Shell (bash)):
Dans le cas habituel, ldd appelle l'éditeur de liens dynamique standard (voir ld.so (8) ) avec la variable d'environnement LD_TRACE_LOADED_OBJECTS définie sur 1.
Je vais illustrer les données du rapport de bogue ci-dessus.
numéro16417.cpp:
#include <string>
#include <iostream>
extern char **environ;
int main() {
for (char **it = environ; *it != nullptr; ++it) {
std::string str(*it);
std::cout << "export " << str.substr(0, str.find('=')) << std::endl;
}
}
build_issue16417.sh (drapeaux supprimés non pris en charge par le compilateur):
#!/bin/bash
_BUILD_TOOL_BASE_NAME=arm-linux-gnueabihf-g++-4.9
_FILE_BASE_NAME=issue16417
${_BUILD_TOOL_BASE_NAME} -pthread -std=gnu++0x -pedantic -ggdb -O2 -pipe -mtls-dialect=gnu2 -ftree-loop-distribution -ftree-vectorize -fmerge-all-constants -fira-loop-pressure -pedantic -c -o ${_FILE_BASE_NAME}.o ${_FILE_BASE_NAME}.cpp
${_BUILD_TOOL_BASE_NAME} -pthread -std=gnu++0x -pedantic -ggdb -O2 -pipe -mtls-dialect=gnu2 -ftree-loop-distribution -ftree-vectorize -fmerge-all-constants -fira-loop-pressure -pedantic -Wl,-O1 -Wl,--sort-common -Wl,--enable-new-dtags -Wl,--gc-sections -Wl,--hash-style=gnu -o ${_FILE_BASE_NAME}.${_BUILD_TOOL_BASE_NAME} ${_FILE_BASE_NAME}.o -Wl,--as-needed -pthread -Wl,-Fuse-ld=gold
Sortie:
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> uname -a Linux cfati-ubtu16x64-0 4.15.0-39-generic #42~16.04.1-Ubuntu SMP Wed Oct 24 17:09:54 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> which arm-linux-gnueabihf-g++-4.9 /usr/bin/arm-linux-gnueabihf-g++-4.9 [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ldd /usr/bin/arm-linux-gnueabihf-g++-4.9 linux-vdso.so.1 => (0x00007ffdf55c2000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f59b6c62000) /lib64/ld-linux-x86-64.so.2 (0x00007f59b702c000) [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> dpkg -S /usr/bin/arm-linux-gnueabihf-g++-4.9 g++-4.9-arm-linux-gnueabihf: /usr/bin/arm-linux-gnueabihf-g++-4.9 [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ls build_issue16417_g++4.9.sh issue16417.cpp [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ./build_issue16417_g++4.9.sh [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ls build_issue16417_g++4.9.sh issue16417.arm-linux-gnueabihf-g++-4.9 issue16417.cpp issue16417.o [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> file ./issue16417.arm-linux-gnueabihf-g++-4.9 ./issue16417.arm-linux-gnueabihf-g++-4.9: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=17e0f3d6ceaa13df4ac031e6581074757abee36c, not stripped [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> echo ${_QEMU_CMD} /usr/bin/qemu-arm-static -L /usr/arm-linux-gnueabihf [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ${_QEMU_CMD} ./issue16417.arm-linux-gnueabihf-g++-4.9 qemu: uncaught target signal 11 (Segmentation fault) - core dumped Segmentation fault (core dumped) [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ldd ./issue16417.arm-linux-gnueabihf-g++-4.9 not a dynamic executable
Comme prévu, ldd (normal) ne fonctionne pas pour les binaires ARM.
Dans le script ldd, il y a une ligne (aucune autre ne fait référence à .so s) quelque part au début:
RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2"
Comme on le voit, il n’a pas les correctes ld.so (jusqu’à présent, il n’ya que les i686 et x86_64, donc il ne peut pas gérer ARM binaires. Pour que tout fonctionne correctement (notez que pour chaque option, Sudo est requis):
J'ai choisi le 2dakota du Nord une variante. Mais où est BRAS _ {ld.so? Comme vous l'avez probablement deviné, il peut être obtenu à partir de $ {_ QEMU_CMD} env var (après tout, qemu en a également besoin). Sur ma machine, c'est: /usr/arm-linux-gnueabihf/lib/ld-2.23.so} _ (libc6-armhf-cross requis, mais cela devrait être installé maintenant). Donc, j'ai copié ldd dans (arm-linux-gnueabihf-ldd}, et remplacé la ligne ci-dessus par:
_LIB_PATH=/usr/arm-linux-gnueabihf/lib
RTLDLIST="${_LIB_PATH}/ld-2.23.so"
# @TODO - cfati: Not a fan of the line below (I think it's considered bad practice), but without it, it can't find the libraries locations.
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${_LIB_PATH}
Poster également le format diff _ (vérifier [SO]: Exécuter/déboguer les tests unitaires d'une application Django à partir du menu contextuel en cliquant avec le bouton droit de la souris dans PyCharm Community Edition? (Réponse de CristiFati) (Patching utrunner section) pour savoir comment l’appliquer):
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> diff --binary -uN /usr/bin/ldd /usr/bin/arm-linux-gnueabihf-ldd --- /usr/bin/ldd 2018-01-15 04:49:13.000000000 +0200 +++ /usr/bin/arm-linux-gnueabihf-ldd 2018-12-04 19:34:19.499001000 +0200 @@ -26,7 +26,13 @@ TEXTDOMAIN=libc TEXTDOMAINDIR=/usr/share/locale -RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2" +_LIB_PATH=/usr/arm-linux-gnueabihf/lib + +RTLDLIST="${_LIB_PATH}/ld-2.23.so" + +# @TODO - cfati: Not a fan of the line below (I think it's considered bad practice), but without it, it can't find the libraries locations. +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${_LIB_PATH} + warn= bind_now= verbose=
Essayez d’exécuter "new" ldd sur l’exécutable ARM et voilà:
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> arm-linux-gnueabihf-ldd ./issue16417.arm-linux-gnueabihf-g++-4.9 libstdc++.so.6 => /usr/arm-linux-gnueabihf/lib/libstdc++.so.6 (0xf66c6000) libc.so.6 => /usr/arm-linux-gnueabihf/lib/libc.so.6 (0xf65da000) /lib/ld-linux-armhf.so.3 => /usr/arm-linux-gnueabihf/lib/ld-2.23.so (0xf6fd7000) libm.so.6 => /usr/arm-linux-gnueabihf/lib/libm.so.6 (0xf6562000) libgcc_s.so.1 => /usr/arm-linux-gnueabihf/lib/libgcc_s.so.1 (0xf6538000)
Note: Ce qui vient ensuite est ne fait pas partie de la question/réponse.
Quoi qu'il en soit, en remplaçant --as-nécessaire par --no- selon les besoins dans build_issue16417.sh, on obtient:
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> vi build_issue16417_g++4.9.sh [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ./build_issue16417_g++4.9.sh [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ${_QEMU_CMD} ./issue16417.arm-linux-gnueabihf-g++-4.9 export LC_NAME export LC_TIME export LESSCLOSE export XDG_RUNTIME_DIR export LESSOPEN export SSH_CONNECTION export XDG_DATA_DIRS export LOGNAME export HOME export SHLVL export PAPERSIZE export LC_MEASUREMENT export LANG export PWD export LC_IDENTIFICATION export QT_QPA_PLATFORMTHEME export PATH export MAIL export LC_TELEPHONE export LS_COLORS export USER export SSH_TTY export OLDPWD export LC_NUMERIC export SSH_CLIENT export Shell export TERM export Android_HOME export LC_MONETARY export XDG_SESSION_ID export LC_ADDRESS export LC_PAPER
:)