Подмена функций 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

Ответы (0 шт):