Я пытаюсь привязать адреса скрытых переменных символов и объектов виртуальной таблицы C ++ и экспортировать их в динамическую библиотеку. Любая помощь будет оценена.
Фон
Я перевожу большой проект C & C ++ со статической компиляции на динамическое связывание. Продукт чувствителен к производительности, поэтому я стараюсь минимизировать (значительное) влияние динамического связывания.
Я изменил видимость по умолчанию на скрытый (-fvisibility=hidden
) в компиляции C / C ++. Я также использую -mcmodel=large
. Это значительно улучшило производительность. Поскольку это огромный проект, повлиять на изменения интерфейса в рамках всего проекта не совсем возможно.
Моя проблема связана с юнит-тестами. Модульные тесты связаны с одним и тем же кодом, и я бы предпочел связать их динамически, поскольку это должно быть одним из главных преимуществ перехода. Однако юнит-тесты ссылаются на скрытые символы в библиотеке.
Функция
Я переименовываю функции в библиотеке, используя objcopy
. Я создаю заглушки сборки с видимостью по умолчанию, которые переходят непосредственно к скрытым символам У меня есть две библиотеки: одна для тестов и одна для производства, но обе они созданы из одних и тех же объектных файлов, в библиотеке тестов есть дополнительный файл заглушек.
Переменные
Я не могу использовать заглушки, так как это адресация адресов в таблице GOT, если я правильно понимаю, поэтому код не выполняется. Проблема переменных - меньшее зло, поскольку существует мало ссылок на глобальные переменные, поэтому их можно сделать видимыми хирургическим путем.
Класс виртуальных таблиц
Виртуальные таблицы класса являются слабыми объектами. Опять же, если я правильно понимаю, я не могу использовать метод заглушек, поскольку они не могут быть вызваны. Мне нужен какой-то способ связать их и сделать их видимыми, в противном случае мне нужно откатить почти все улучшения производительности или перекомпилировать весь код для тестов.
Есть предложения?