我正在将ODBC
驱动程序从Windows
移植到Linux
驱动程序用C
编写
ODBC
对Linux
起作用的方式是应用程序调用ODBC管理器(ODBCM
),然后ODBC管理器加载相应的驱动程序并传递函数调用。
假设我的驱动程序(编译为共享对象)公开了两个函数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
...
}
变化缓慢,感觉很笨拙。
答案 0 :(得分:7)
尝试将.so
与-Bsymbolic
链接器选项链接(在gcc命令行上传递-Wl,-Bsymbolic
)。这会在链接时绑定所有库内部符号,以便以后不会进行任何动态链接。