2016-05-10 5 views
2

Я переопределяю глобальные новые/удаленные операторы C++ в проекте Linux. Все это прекрасно работает в моем собственном коде, пока я не узнал, что новые/удаленные символы в системных библиотеках также заменяются моим кодом! Это очень плохая проблема, поскольку она выходит за пределы «уровня зла», который я намеревался.C++ настраиваемые глобальные новые/удаленные системные библиотеки

Вопрос в том, как я могу помешать компоновщику/компилятору заменить новые/удалить syms из других (системных) разделяемых библиотек? Или, точнее, как я могу контролировать, какие общие библиотеки связывают сим в моей библиотеке? Я бы хотел, чтобы системные библиотеки все равно использовали свою стандартную реализацию new/delete. Особенно, когда исполняемый файл загружает другие дополнительные динамические библиотеки с помощью dlopen(), которые не под моим контролем.

Пользовательская глобальная реализация нового/удаления оператора встроена в общую библиотеку.

Я искал по всему Интернету, как управлять динамической связью, но не удалось. Сначала я пытаюсь изменить порядок ссылок библиотеки на тестовый исполняемый файл, но ничего не изменил.

+2

Вы используете неправильную точку настройки. Замена глобальных операторов полезна, если вы действительно хотите сделать это изменение повсюду. Если вы хотите настроить распределение в локализованной библиотеке, вы должны использовать какой-либо другой механизм (например, распределители) для предоставления точки настройки. –

+2

Учитывайте перегрузку новых и удаленных операторов только на своих классах. Если у вас есть базовый класс для большинства ваших объектов, сделайте это там. Это должно охватывать большую часть используемой памяти. Затем вы можете попробовать создать пользовательские распределители STL в тех случаях, когда вам нужно управлять своими объектами внутри контейнеров STL. –

+0

Перегрузка нового/удаляемого только в общем классе «root» не помогла бы мне в ситуациях, таких как простая функция выделения необработанной памяти. Рефакторинг большого количества кода для использования пользовательской базы new/delete будет утомительным. Я просматриваю возможность LD_PRELOAD распределителя, чтобы проверить его на других программах на C++. – JATothrim

ответ

2

Я узнал, что новые/удаленные символы в системных библиотеках также заменяются моим кодом!

Вы можете прочитать объяснение, почему это происходит here.

Вопрос в том, как предотвратить замену компоновщика/компилятора новыми/удалить syms из других (системных) разделяемых библиотек?

Вы можете сделать свой ::operator new и ::operator delete частного к вашей библиотеке путем строительства с -fvisibility=hidden и явно маркировки функции, которые вы сделать хотите экспортировать с __attribute__((visibility("default"))). Кроме того, вы можете использовать linker version script для достижения того же результата.

+0

Я знал, что библиотеки linux .so сильно отличаются от win .dlls. Но я не знал, что динамические сим, разрешенные в исполняемом файле, будут связаны как архивные файлы, требующие наличия единого определения во всем связанном коде. Так что это невозможно сделать в * nix .. слишком плохо. Спасибо еще! Я уже использую -fvisibility = hidden для компиляции двоичных файлов и маркировки экспортированных funcs в коде. – JATothrim

+1

Слишком плохо, что он не работает в этой операционной системе супермаркета. Я обозначил проект с помощью -fvisibility = hidden, отмеченным оператором new с __attribute __ ((видимость («скрытая»))). Тем не менее моя системная библиотека переоценивается моим оператором –

Смежные вопросы