Intereting Posts
Я не могу отправить почту на адрес Gmail, используя Postfix Выполняется ли eval путем создания процесса оболочки для оценки следующей команды? Отменить «Без границ» в KDE Не удалось создать локальное репо в CentOS Как изменить тему оболочки gnome с помощью bash-скрипта? Предоставление разрешений всем пользователям в группе для записи в каталог и все его подкаталоги Построенное новое ядро, LVM не будет монтироваться из initrd Установка Linux на жесткий диск, который будет использоваться другим компьютером с различным оборудованием Запуск программы автоматически? Пропуск псевдо-файловых систем при выполнении find / exec проблема с использованием grep с файлом шаблона гостевая ОС kvm недоступна после перезагрузки системы Вывод из strace в другое окно Bash, чтобы получить результат передачи rsync и закрепить его как каталог в исходном каталоге Есть ли одна '03 зарегистрированная UNIX, которая не может делать rm -foo в этот момент?

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

Использовать 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] ...