Столкновение имени функции в общих объектах - PullRequest
4 голосов
/ 28 января 2011

Я портирую драйвер ODBC с Windows на Linux.
Драйвер написан на C.
ODBC работает на Linux, когда приложение выполняет вызов ODBC Manager (ODBCM), который, в свою очередь, загружает соответствующий драйвер и передает вызов функции.

Предположим, мой драйвер, скомпилированный в общий объект, предоставляет две функции A и B.
Предполагается, что ODBCM - это функция вызовов A, а функция A - это функция вызовов B.
На самом деле происходит то, что когда функция A вызывает функцию B, а не функцию B' (которая имеет то же имя, что и B, находится в общем объекте libodbc и загружается Linux с использованием ODBC приложения) вызывается.

Я чувствую, что должен быть либо флаг времени компиляции, либо инструмент модификации библиотеки после компиляции, который исправит эту проблему.
В настоящее время я перебираю библиотеку по одной функции за раз:

_B(){ // rename old functions
  ...
}
B() { // add new wrapper function
  return _B(); // which just calls old
}

_A() {
  ... 
  _B(); // Change calls to renamed functions
  ... 
}

Который медленно меняется и чувствует себя глупым.

1 Ответ

7 голосов
/ 28 января 2011

Попробуйте связать ваш .so с параметром компоновщика -Bsymbolic (передайте -Wl,-Bsymbolic в командной строке gcc). Это связывает все внутренние библиотечные символы во время соединения, поэтому они не будут подвергаться динамическому связыванию позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...