Подмена функций getenv и setenv в динамической библиотеке
У меня возникла потребность подменить функции работы с env-переменными при работе на linux и, как вы понимаете, подменить их, просто добавив дефиницию в исходники несложно. Однако структура моего проекта подразумевает подключение динамической библиотеки, в которой подмена также должна сработать.
Суть в том, что дин. библиотека (назовём её envLib) используется в нескольких проектах, а подмена должна произойти только в одном (назовём его myProj).
Очевидный вариант: в каком-либо из .срр-шников myProj определить требуемые функции и работать как обычно. И эксперименты показали, что такой подход сработал: при запуске вызовы getenv в т.ч. производимые из методов envLib обратились не к стандартной реализации из stdlib, а к кастомной.
Но хотелось бы быть уверенным в том, что так будет работать всегда. Дело в том, что проект будет компилироваться под различные архитектуры и чтобы интегрировать такое решение нужно быть уверенным, что на любой архитектуре при подключении envLib к проекту myProj загрузчик библиотек будет приоритизировать определение getenv из myProj над определением из stdlib.
Пример структуры вызовов:
//main.cpp
#include <string>
#include <iostream>
#include "envLib.h"
using namespace std;
char *getenv(const char *__name)
{
cout << "my_getenv called!" << endl;
return nullptr;
}
int main()
{
getenv(nullptr);
call_getenv_by_lib();
return 0;
}
//envLib.h
#ifndef UNTITLED_ENVLIB_H
#define UNTITLED_ENVLIB_H
void call_getenv_by_lib();
#endif//UNTITLED_ENVLIB_H
//envLib.cpp
#include "envLib.h"
#include "iostream"
using namespace std;
void call_getenv_by_lib(){
getenv(nullptr);
}
Сборка и запуск:
g++ envLib.* -shared -fPIC -o libenvLib.so
g++ main.cpp -L $(pwd) -l envLib -o result
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)
./result