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

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

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

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

  • Как найти инструменты для сборки дистрибутива Linux?
  • libX11.so.6 Не найдено
  • Построение пакетов Python завершается успешно, но пакет неправильно построен
  • Nix: Пропуск единичных тестов при установке пакета Haskell
  • Ошибка CMake: текущий каталог отличается от
  • ld не может найти существующий 32-разрядный libm
  •  // 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 

  • Как использовать версию пакета еще не опубликованные nixpkgs (но описаны в ветвях разработки nixpkgs)?
  • «Фатальная ошибка: stdio.h: нет такого файла или каталога» при компиляции файла C
  • Как я могу создать пакет .deb с моей скомпилированной сборкой OpenCV?
  • Экспортированные функции bash иногда видны с Perl
  • ld не может найти существующий 32-разрядный libm
  • Python.h: Нет такого файла или каталога
  • 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] ... 
    Linux и Unix - лучшая ОС в мире.