젤리빈 소스를 통채로 가져와서 기본 디바이스를 한번 빌드하고, 이 상태에서 앱을 개발하면 편리한 잇점이 있다.

그런데 이 환경에서 native 라이브러리를 컴파일 해서 ICS가 올라간 폰에 앱을 올렸더니 reloc_library 오류가 나면서 __open_2 라는 심볼을 못찾아 오류를 내고 있었다.

arm-eabi-objdump -R libfoobar.so 명령으로 foobar 라이브러리에 __open_2 심볼을 찾아보니 있었고, 예전에 ICS 소스트리에서 컴파일했던 잘 돌아가던 구버전의 라이브러리는 __open_2 심볼을 찾아볼 수가 없었다.

__open_2라는 심볼이 무엇인가 구글로 검색해서 살펴보니 2012년에 bionic/libc 소스에 추가된 부분이었다.

https://github.com/CyanogenMod/android_bionic/commit/8118f62a7d3f1af1edb47e0bc2a49af1d523ae0f#diff-e0d07145fa9f6b0a5562c1be920578ec

이와 관련된 Android.mk파일을 찾아서 FORTIFY_SOURCE를 어떻게 정의하고 있나 살펴봤더니, 아니나다를까 일부 native 라이브러리는 FORTIFY_SOURCE 정의를 끄고 컴파일하고 있었다.

그래서 LOCAL_CFLAGS := -U_FORTIFY_SOURCE 라인을 Android.mk에 추가한 후에 라이브러리를 젤리빈 소스트리에서 다시 컴파일하고 심볼을 objdump -R 명령으로 다시 살펴보니 __open_2 심볼이 사라졌다. 빙고~!

그리고 당연히도 reloc_library 오류가 나지 않고 아무런 문제 없이 앱이 실행된다~

by dumpcookie 2014. 8. 30. 11:39