Переменная среды LD_LIBRARY_PATH

Я пытаюсь проверить LD_LIBRARY_PATH среды LD_LIBRARY_PATH . У меня есть программа test.c следующим образом:

 int main() { func("hello world"); } 

У меня есть два файла func1.c и func2.c:

 // func1.c #include <stdio.h> void func(const char * str) { printf("%s", str); } 

А также

 // func2.c #include <stdio.h> void func(const char * str) { printf("No print"); } 

Я хочу как-то сделать следующее:

  • Преобразуйте func1.c и func2.c в .so файлы – оба с тем же именем func.so (они будут размещены в разных папках, скажем, dir1 и dir2
  • Compile test.c st Я только упоминаю, что у него есть зависимость func.so , но я не говорю, где это (я хочу, чтобы переменная среды использовалась, чтобы найти это)
  • Задайте переменную окружения, сначала попробуйте dir1 а во второй попробуйте dir2 чтобы наблюдать за другим выходом в каждом прогоне test программы

Является ли это выполнимым? Если да, то как сделать шаг 2?

Я сделал следующее для шага 1 (те же шаги для func2):

 $ gcc -fPIC -g -c func1.c $ gcc -shared -fPIC -o func.so func1.o 

  • Компиляция Octave: как добавить новый элемент в каталоги include для Qt?
  • Systemd bash builtins
  • Исполняемый файл не может быть найден
  • Изменить каталог команды
  • Почему я не могу добавить что-то в PATH навсегда?
  • Использование команды cut для переменной окружения
  • Как добавить установленную программу в мой PATH, чтобы я мог запустить ее из командной строки?
  • Экспортированные функции bash иногда видны с Perl
  • One Solution collect form web for “Переменная среды LD_LIBRARY_PATH”

    Использовать ld -soname :

     $ mkdir dir1 dir2 $ gcc -shared -fPIC -o dir1/func.so func1.c -Wl,-soname,func.so $ gcc -shared -fPIC -o dir2/func.so func2.c -Wl,-soname,func.so $ gcc test.c dir1/func.so $ ldd a.out linux-vdso.so.1 => (0x00007ffda80d7000) func.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f639079e000) /lib64/ld-linux-x86-64.so.2 (0x00007f6390b68000) $ LD_LIBRARY_PATH='$ORIGIN/dir1:$ORIGIN/dir2' ./a.out hello world $ LD_LIBRARY_PATH='$ORIGIN/dir2:$ORIGIN/dir1' ./a.out No print 

    -Wl,-soname,func.so (это означает, что -soname func.so передается в ld ) вставляет в SONAME атрибут func.so Вы можете проверить его с помощью readelf -d :

     $ readelf -d dir1/func.so Dynamic section at offset 0xe08 contains 25 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000e (SONAME) Library soname: [func.so] ... 

    Связанный с этим func.so с SONAME , a.out имеет это в своем атрибуте NEEDED :

     $ readelf -d a.out Dynamic section at offset 0xe18 contains 25 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [func.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] ... 

    Без -Wl,-soname,func.so , вы получите следующее: readelf -d :

     $ readelf -d dir1/func.so Dynamic section at offset 0xe18 contains 24 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] ... $ readelf -d a.out Dynamic section at offset 0xe18 contains 25 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [dir1/func.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] ... 
    Interesting Posts

    Команды, запущенные при открытии терминала, не отображаются в истории

    awk + print awk вывод в одной строке

    Несколько вопросов о системных вызовах и модулях ядра (параллельные службы ядра)

    E: Не удалось найти пакет tlp

    Ubuntu: в сети со многими клиентами есть две машины, которые не могут одновременно получать доступ к веб-браузеру через браузер

    Использование xdg-open odt файлов

    медленная передача файлов через последовательный порт с кошкой

    Автоматический вход через ssh (нет установленной среды GUI / отсутствует ssh-agent)?

    Контур Loop в текстовых файлах

    'last -d' ДЕЙСТВИТЕЛЬНО медленный

    Список недавно измененных файлов

    Домашний путь пользователей в сценарии bash

    rsync с именем странных файлов

    Должен ли я использовать символические ссылки в / usr / bin или вместо этого использовать переменную PATH?

    Альтернатива iotop для пользователей без полномочий root без привилегий sudo

    Linux и Unix - лучшая ОС в мире.