Как написать библиотеку C .so, чтобы заменить существующую библиотеку C ++ .so? - PullRequest
5 голосов
/ 03 марта 2010

Позвольте мне объяснить сценарий. У нас есть устаревшая библиотека C ++ .so. Функции в этой библиотеке объявлены с extern "c" {}, поэтому библиотека может использоваться как программой на C, так и C ++, плюс, по некоторым причинам, она была создана с опцией --static-libgcc.

Эта старая библиотека очень старая и ее сложно поддерживать. Теперь нам удалось написать его замену, но на языке Си. Допустим, старая библиотека называется libfoo.so (старая), а новая - libfoo.so (новая). Для данного bar.o его можно связать со старым или новым libfoo.so, чтобы создать исполняемый файл, скажем, bar.exe. Но bar.exe может работать только с той же библиотекой .so, с которой он связан, другими словами, эти две библиотеки не взаимозаменяемы.

РЕДАКТИРОВАТЬ # 1 : я сделал символическую ссылку с именем libfoo.so, чтобы указать на libfoo.so (старый) или libfoo.so (новый). Эта символическая ссылка libfoo.so находится в LD_LIBRARY_PATH во время выполнения.

РЕДАКТИРОВАТЬ # 2 : Когда я связал bar.o со старым libfoo.so и сгенерировал bar.exe, если я запустил этот bar.exe с новым libfoo.so, он сообщил об ошибке undefined symbols , По nm этим двум libfoo.so я могу найти эти символы в старом, но не в новом. Символы похожи на _ZSt4cerr, которое является искаженным именем в C ++ lib (хотя оно и было введено --static-libgcc), и, конечно, новый libfoo.so не содержит таких символов.

РЕДАКТИРОВАТЬ # 3 : Если я просто скомпилирую и свяжу код C с g ++ вместо gcc, имеет ли смысл?

Как мне это реализовать?

EDIT # 4 : Сегодня мне удалось скомпилировать / связать новый запрограммированный на C libfoo с g ++ (со статическим libgcc, статическим libstdc ++), это может привести к тому, что все символы c ++ будут содержаться в libfoo.so , Это может заставить все работать гладко, но не то, что я действительно хочу.

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Если вы создаете и связываете с новым, можете ли вы заставить его связываться со старым? Похоже, вы создали двоичную совместимую библиотеку, но только в одном направлении.

1 голос
/ 03 марта 2010

Редактировать # 2 помогает.

Обычно ваш bar.exe пытается выполнить инициализацию C ++ для этой библиотеки.

Вам придется как минимум предоставить пустые реализации идентично искаженных имен, чтобы bar.exe мог динамически искать ваш .so и находить / вызывать их.

Если вам повезло меньше, вам может понадобиться, чтобы эти функции сделали что-то значимое, что код верхнего уровня интерпретирует как успех.

Удачи

0 голосов
/ 03 марта 2010

дайте им одно и то же имя и поместите в разные каталоги. использовать LD_LIBRARY_PATH env. переменная для установки каталога с нужной библиотекой перед любыми другими каталогами.

...