IT한 것/Mobile (iOS, AOS)

Archive를 -l 로 합치기

lovian 2010. 8. 10. 16:45
이리저리 찾다보면, 이 옵션은 디버깅용으로 빌드시 다른 플랫폼들이 빌드되면, 시간이 걸리는 것을 줄이기 위해서 현재 테스트할 플랫폼에 맞는 것만 빌드하도록 하는 것이라고 한다.

뭐 괜찮은 생각인것 같은데, Archive 를 만드는데 문제가 발생했다.

이상하게 해당 Archive를 이용하면 duplicate symbol 발생으로 링킹에 실패하는 문제가 발생했다.
그것도 기본 설정으로는 아무 문제가 없었는데, -all_load 옵션으로 Archive에 내장된 모든 심볼을 로딩하게 하면,
문제가 발생했다.

nm 유틸리티를 이용하여 symbol목록을 확인 한 결과 정말로 모든 symbol이 두 벌씩 들어가는 것을 확인 했다.

프로젝트 옵션의 주요 값으로는
base sdk                          iPhoneOS 4.0 SDK
architecture                       standard arch (armv6, armv7)
build active architeture only NO
valid arch                          armv6, armv7
Other link flags                  -lmylib
와 같았다.

여기서 architecture only 옵션을 YES로 켜면, symbol 한 벌씩 들어가는 것을 확인 할 수 있었다.

단순히 이 옵션이 문제라고 생각했지만, 의미 그대로 해당 architecture를 빌드해주는 것 뿐이며,
실제 원인은 mylib archive였다. 이 녀석은 universal binary이며 armv6 빌드시 해당 archive에 묶이는 형태는 아래와 같다.

mylib2 - objects(armv6)
          - objects in mylib (armv6)
          - objects in mylib (armv7)

armv7으로 빌드하면 아래와 값이 묶인다.
mylib2 - objects(armv7)
          - objects in mylib (armv6)
          - objects in mylib (armv7)

옵션을 NO로하면.
mylib2는 위의 두 가지가 합쳐지는데, 이 때 중복 검사 같은게 없나보다.
mylib에 있던 심볼들이 두개씩 들어가게 된다.

그 결과 mylib2를 -all_load 옵션과 함께 적용하면,
진짜 심볼이 두개인 녀석으로 인해 링킹이 실패한다.

후.. 생고생 ㅠㅠ