Требуется объяснение сценария - PullRequest
0 голосов
/ 16 сентября 2018

Я нашел следующий скрипт из чужого проекта.

Может кто-нибудь объяснить, что делает скрипт ниже?

for libtocopy in $LIBS_TO_COPY ; do 
    libfile=`ldd bin/foo.so | grep lib${libtocopy} | cut -d' ' -f 3`
    if [ "x$libfile" != "x" ] ; then 
        #echo "$libtocopy : copying $libfile in libs"
        cp $libfile foo/libs 
    fi
    done

1 Ответ

0 голосов
/ 19 сентября 2018

Короче говоря, скрипт извлечет набор динамически разрешенных общих библиотек из двоичного файла bin/foo.so, упомянутого в скрипте.

Команда, управляющая всем сценарием: ldd . Это разрешит и напечатает любые динамические зависимости для исполняемого файла.

например. это пример вывода (на Raspberry Pi, который был удобен, но вывод совместим):

ldd /bin/grep
        linux-vdso.so.1 (0x7ef36000)
        /usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76f8b000)
        libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0x76efe000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76eeb000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76dac000)
        /lib/ld-linux-armhf.so.3 (0x76fa1000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76d83000)

Таким образом, для каждого из имен в переменной LIBS_TO_COPY (например, pthread в последней строке выше) будет найдена строка с префиксом lib (например, libpthread).

Каждая из этих совпадающих строк передается по каналу cut, который выберет третье поле в строке (используя пробел в качестве разделителя) - т.е. разрешенный путь к этой библиотеке.

Затем эти разрешенные зависимости копируются в выбранный каталог.

Например, с echo в сценарии без комментариев и bin/foo.so переключено на /bin/grep:

$ export LIBS_TO_COPY='pthread c dl'
$ bash libextract.bash
pthread : copying /lib/arm-linux-gnueabihf/libpthread.so.0 in libs
c : copying /lib/arm-linux-gnueabihf/libc.so.6 in libs
dl : copying /lib/arm-linux-gnueabihf/libdl.so.2 in libs

(Оболочки bash и sh дают одинаковый выход).

...