共享对象中的函数名称冲突

时间:2011-01-28 18:41:36

标签: c odbc shared-libraries

我正在将ODBC驱动程序从Windows移植到Linux 驱动程序用C编写 ODBCLinux起作用的方式是应用程序调用ODBC管理器(ODBCM),然后ODBC管理器加载相应的驱动程序并传递函数调用。

假设我的驱动程序(编译为共享对象)公开了两个函数AB。 应该发生的是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 个答案:

答案 0 :(得分:7)

尝试将.so-Bsymbolic链接器选项链接(在gcc命令行上传递-Wl,-Bsymbolic)。这会在链接时绑定所有库内部符号,以便以后不会进行任何动态链接。