Переменная среды 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 

  • Как работает sudo -E?
  • Что делает переменная среды рабочего стола Enlightenment (E17) «PANTS = ON»?
  • Изменить каталог команды
  • Параметры среды для исполняемых файлов setuid
  • Компиляция Octave: как добавить новый элемент в каталоги include для Qt?
  • функции оболочки и переменные с тем же именем
  • Запустите программу X11 под Cygwin
  • Как изменить текстовый редактор по умолчанию в дистрибутиве Debian (сжатие)
  • 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

    Как отправить ключ для выхода из режима прокрутки в tmux?

    Передача аргумента нескольким командам в одной строке

    Найти WiFi MCS Index в Linux

    Разрешения при создании простого пакета Python для pip

    Как удалить разделитель поля, который закончился на каждой последней строке?

    Как запустить скрипт с другого пути и узнать путь к скрипту?

    Как открыть главы руководства пользователя Vim в Vim

    Сравните несколько файлов с файлом ref и распечатайте, если это соответствует

    Скопируйте раздел BTRFS на внешний раздел BTRFS на жестком диске, включая моментальные снимки

    Как использовать функцию bash как регулярную команду в цепочке труб?

    Выполнение сценария Nmap для обнаружения сердечной недостаточности терпит неудачу

    раздел анализа аргументов по умолчанию

    Медленное выполнение сценария

    Доступ к результатам трубы как переменной?

    Не удалось войти в tty1

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