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

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

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

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

  • Nix: Пропуск единичных тестов при установке пакета Haskell
  • Случайное удаление важных библиотек
  • Kernel Panic - не синхронизация: VFS: невозможно монтировать root fs после компиляции нового ядра
  • Как решить «Не удалось создать основной модуль гостевых дополнений»
  • Неопределенная ссылка на математические функции при связывании с gcc
  • Как перекомпилировать пакет, если он установлен через apt-get? (Ubuntu)
  •  // 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 

  • Почему autoconf.h не копируется автоматически на свое место?
  • Проверка необходимых M4 макросов ... yelp.m4 не найден
  • Могу ли я построить дистрибутив linux с libc вместо glibc
  • Выборочно создавать пакеты с dpkg-buildpackage
  • Построить Хром из источника
  • К чему относятся компиляция и ссылка?
  • 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 - лучшая ОС в мире.