2011-01-28 4 views
4

ODBC 드라이버를 Windows에서 Linux으로 이식하는 중입니다.
드라이버는 C로 작성되었습니다.
에서 ODBC이 작동하는 방식은 응용 프로그램이 적절한 드라이버를로드하고 함수 호출을 전달하는 ODBC 관리자 (ODBCM)를 호출한다는 것입니다.공유 객체의 함수 이름 충돌

공유 객체로 컴파일 된 내 드라이버는 AB의 두 가지 기능을 제공한다고 가정합니다.
은 호출 기능이 A이고, 기능이 A 인 것은 호출 기능이 B입니다. 실제로 무슨 일이 일어나고 무엇
기능 A 호출이 함수 대신 B'B를 작동 할 때 (B 같은 이름을 가진는 libodbc 공유 객체에 위치하고 있으며 ODBC 응용 프로그램을 사용 Linux에 의해로드)가 불려 갔을 것입니다.

나는이 문제를 해결할 수있는 컴파일 타임 플래그 또는 포스트 컴파일 라이브러리 수정 도구가 있어야한다고 생각합니다. 현재
나는 다음과 같은 일을 한 번에 라이브러리를 하나 개의 함수를 통해 갈거야 : 변경 느리고 미봉책 느낌

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

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

합니다.

답변

6

.so-Bsymbolic 링커 옵션으로 연결해보십시오 (gcc 명령 줄에서 -Wl,-Bsymbolic을 전달하십시오). 이렇게하면 링크 타임에 모든 라이브러리 내부 심볼을 ​​바인드하므로 나중에 동적 링크를 거치지 않습니다.

+0

이 문제가 해결되었습니다. 수동으로 함수 이름을 변경하고 래퍼를 작성하는 데 수 시간의 시간을 절약 해 주셔서 감사합니다. – TheGeneral

+0

"링크 타임에 모든 라이브러리 내부 심볼을 ​​바인딩하는"의미와이 문제를 해결하는 방법에 대해 설명해 주시겠습니까? 이 플래그가 공유 라이브러리에서 정적 링크를 야기한다고 말하는 것 같습니다. 맞습니까? 그리고이 플래그와 연결된 프로그램은 런타임에 공유 라이브러리에 액세스 할 필요가 없습니까? 내가 답장을하기 전에 이것을 알아 내면 편집을 추가 할 것입니다. 감사. – Praxeolitic