IT한 것/Mobile (iOS, AOS)

iPhone SDK 4.0 beta3에서 기존 라이브러리 링킹 실패(symbol not found)

lovian 2010. 5. 12. 16:47
iPhone SDK 4가 아직 완성 release버전은 아니지만,
이전의 호환성을 위해서 기존에 빌드된 라이브러리를
그대로 링킹 시도를 해보았는데.

분명히 링킹이 되었음에도, symbol not found 오류를 내뱉어낸다.
ar로 모듈을 까보아도 분명히 심볼은 있음을 확인할 수 있다.

혹시나 해서 특정 object 파일을 까보기 시작했다.

자체 makefile로 빌드한 모듈


Xcode project를 생성해서 기본 값으로  빌드한 모듈


각각 컴파일 옵션이 다르므로 뭐야 완전 다르잖아 식의 판단은 안하는게 낫다.

중요한 점은. 외부 API를 참조하는 표기법이 다르다는 것이다.
NSObject 를 참조하는 부분을 보면,
각각
x86.o:          U .objc_class_name_NSObject
x86.o:          U _OBJC_CLASS_$_NSObject

이렇게 되어 있다.

동일한 클래스를 참조함에도 표기법이 다르다.
실제 컴파일 옵션을 하나하나 비교하면서 살펴본 결과,
-fobjc-abi-version=2 라는 옵션을 makefile에 넣어주자 동일한 표기법으로 나오기 시작했다.

문제는 해당 옵션으로 구글링은 해봐야 별로 나오는게 없다.
그럼 gcc에게 물어보자.
gcc --help -v

...
-fobjc-abi-version=         This switch lacks documentation
...

와우.. 그만 추적하자.

이제 대망의 링킹시간.
...
_objc_msgSend_fixup symbol이 없단다.
얘는 누구지? ㅎㅎ
abi version옵션을 주면서 추가된 symbol인데
또 비교를 해보니 -fobjc-legacy-dispatch 옵션이 적용되어 있다.
추가하니 링킹에 성공한다.

결론은 iPhone SDK 4.0 beta3 부터 ABI 버전이 기본 2로 들어가고, 이전 버전의 ABI로 빌드된 object 파일은 서로 혼용하여 사용할 수 없는가보다.

이 상태로 4.0이 배포되면, 라이브러리 제공사들은 리빌드하지 않을 수 없을 것이다.