Библиотека не видит переменные окружения.
От: Sharov Россия  
Дата: 29.11.23 10:19
Оценка:
Здравствуйте.

Запускаю дотнетовскую программу на бубунте. Программа настраивает например LD_LIBRARY_PATH.
Далее вызывается библиотека, которая должна искать so файл в LD_LIBRARY_PATH, но не находит.
Причем если до вызова программы сделать export LD_LIBRARY_PATH=чтотам (или еще проще
export LD_LIBRARY_PATH=чтотам && dotnet app), то все работает.
Вопрос -- почему так? Может библиотека ищет переменные окружения в контексте родительского процесса, т.е. shell
в данном случае? Но кажется, что это не должно зависеть от библиотеки. Тогда что?

Т.е., библиотека не видит вновь созданные переменные окружения в текущем процессе, почему так?

Заранее благодарю.
Кодом людям нужно помогать!
Re: Библиотека не видит переменные окружения.
От: andrey.desman  
Дата: 29.11.23 15:10
Оценка: 24 (2)
Здравствуйте, Sharov, Вы писали:

S>Запускаю дотнетовскую программу на бубунте. Программа настраивает например LD_LIBRARY_PATH.


Каким образом настраивает?

S>Далее вызывается библиотека, которая должна искать so файл в LD_LIBRARY_PATH, но не находит.


Каким образом должна искать?

S>Причем если до вызова программы сделать export LD_LIBRARY_PATH=чтотам (или еще проще

S>export LD_LIBRARY_PATH=чтотам && dotnet app), то все работает.

Наверное, имелось в виду
LD_LIBRARY_PATH=чтотам dotnet app

чтобы экспортом не портить текущее окружение.

S>Вопрос -- почему так? Может библиотека ищет переменные окружения в контексте родительского процесса, т.е. shell

S>в данном случае? Но кажется, что это не должно зависеть от библиотеки. Тогда что?

Предположу, что не работает dlopen, и это действительно так. При инициализации libdl вычитывает из окружения LD_LIBRARY_PATH, парсит его и больше к нему не возвращается, так что все модификации этой переменной в самом приложении бесполезны.

S>Т.е., библиотека не видит вновь созданные переменные окружения в текущем процессе, почему так?


Точно не видит?
Re: Библиотека не видит переменные окружения.
От: SkyDance Земля  
Дата: 29.11.23 17:04
Оценка: 24 (2)
S>Запускаю дотнетовскую программу на бубунте. Программа настраивает например LD_LIBRARY_PATH.
S>Далее вызывается библиотека, которая должна искать so файл в LD_LIBRARY_PATH, но не находит.

Более развернутый ответ — здесь: https://stackoverflow.com/questions/19337926/why-change-in-ld-library-path-at-runtime-dosent-reflect-on-the-executable-once
Re[2]: Библиотека не видит переменные окружения.
От: Sharov Россия  
Дата: 29.11.23 21:58
Оценка:
Здравствуйте, andrey.desman, Вы писали:

Выше дан исчерпывающий ответ на причину.
Кодом людям нужно помогать!
Re[3]: Библиотека не видит переменные окружения.
От: andrey.desman  
Дата: 29.11.23 22:52
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Выше дан исчерпывающий ответ на причину.


Там про статически прилинкованные библиотеки, которые загружает ldso в момент запуска процесса. Порядок их загрузки определен слабо, так что тут вообще модификация LD_LIBRARY_PATH не имеет смысла. А про libdl там дан неправильный каммент, что оно должно работать, но это не так. Почему именно, я указал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.