Я нашел решение, когда столкнулся с [Sourceware.Bugzilla]: Ошибка 16628 - Segfault после бинарной библиотеки без pthread dlopen () sa, связанной с pthread при работе над проектом (который включал перенос некоторых *) 1003 * C ++ код ARM ).
Я использую Ubtu 16.04 , и для ARM инструментов кросс-компиляции я установил g ++ - 4.9-arm-linux-gnueabihf (и зависимости, и также заставил меня удалить g ++ - multilib (и зависимости)). Для тестирования (запуска) исполняемых файлов я установил QEMU ( qemu-user-static ).
Согласно [man7]: LDD (1) (который является просто сценарием оболочки ( bash )):
В обычном случае ldd вызывает стандартный динамический компоновщик (см. ld.so (8) ) с переменной окружения LD_TRACE_LOADED_OBJECTS , установленной в 1.
Я собираюсь проиллюстрировать данные из вышеуказанного сообщения об ошибке.
issue16417.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 (удалены флаги, не поддерживаемые компилятором):
#!/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
выход
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q006150000]> ~/sopr.sh
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[prompt]>
[prompt]> 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
[prompt]> which arm-linux-gnueabihf-g++-4.9
/usr/bin/arm-linux-gnueabihf-g++-4.9
[prompt]> 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)
[prompt]> dpkg -S /usr/bin/arm-linux-gnueabihf-g++-4.9
g++-4.9-arm-linux-gnueabihf: /usr/bin/arm-linux-gnueabihf-g++-4.9
[prompt]>
[prompt]> ls
build_issue16417_g++4.9.sh issue16417.cpp
[prompt]> ./build_issue16417_g++4.9.sh
[prompt]> ls
build_issue16417_g++4.9.sh issue16417.arm-linux-gnueabihf-g++-4.9 issue16417.cpp issue16417.o
[prompt]> 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
[prompt]> echo ${_QEMU_CMD}
/usr/bin/qemu-arm-static -L /usr/arm-linux-gnueabihf
[prompt]> ${_QEMU_CMD} ./issue16417.arm-linux-gnueabihf-g++-4.9
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)
[prompt]>
[prompt]> ldd ./issue16417.arm-linux-gnueabihf-g++-4.9
not a dynamic executable
Как и ожидалось, (обычный) ldd не работает для ARM двоичных файлов.
В скрипте ldd есть строка (ни одна другая не ссылается на .so s) где-то в начале:
RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2"
Как видно, у него нет правильных ld.so (пока есть только i686 и x86_64 ), поэтому он может не обрабатывают ARM двоичные файлы. Чтобы все заработало, (обратите внимание, что для каждой опции требуется sudo ):
- Добавьте ARM в конце строки
- Создайте копию ldd и измените эту версию (замените существующие .so s на правильную)
Я выбрал вариант 2 nd . Но где же ARM ld.so ? Как вы, наверное, догадались, его можно получить из $ {_ QEMU_CMD} env var (в конце концов, qemu также нуждается в этом). На моей машине это: / usr / arm-linux-gnueabihf / lib / ld-2.23.so ( libc6-armhf-cross требуется, но это уже должно быть установлено). Итак, я скопировал ldd в arm-linux-gnueabihf-ldd и заменил приведенную выше строку на:
_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}
Также публикует формат diff (отметьте [SO]: запускать / отлаживать UnitTests приложения Django из контекстного меню правой кнопкой мыши в PyCharm Community Edition? (Ответ @ CristiFati) ( Patching utrunner раздел) о том, как его применить):
[prompt]> 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=
Попробуйте запустить " new " ldd на исполняемом файле ARM и voilà :
[prompt]> 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)
Примечание : Что будет дальше, не является частью вопроса / ответа .
В любом случае, заменив - по необходимости на - нет- по необходимости в build_issue16417.sh , получая:
[prompt]> vi build_issue16417_g++4.9.sh
[prompt]> ./build_issue16417_g++4.9.sh
[prompt]> ${_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
:)