공유 라이브러리 링크 포함시키기~ & 바이너리 실행 오류~
기존에 작성한 안드로이드 플랫폼 HelloWorld 예제 는 기본적인 c, c++ 라이브러리만 포함시켜
빌드, 링크 했었다.
이런경우는 크게 문제될게 없는데.. 안드로이드의 공유라이브러리들을 사용하고자
하는 경우에는 슬금슬금 문제점이 많아지기 시작한다.
static 라이브러리는 빌드 시점에 링크되어 포함되지만 dynamic(shared) 라이브러리는
실행시점에 링크되어야 한다.
공유 라이브러리를 사용해 빌드하면 정상적으로 바이너리가 생성되나 실제 안드로이드에
넣어보면 해당 바이너리는 실행되지 않고, 찾을 수 없다는 메시지만 나타난다.
# ./helloworld
# helloworld: not found
그리고, arm 링커 관련해 링크 정의가 되지 않는 경우에도 아래와 같은 오류가 생긴다.
# ./helloworld
[1] + Stopped (signal) ./helloworld
이런 경우 우선 바이너리 생성시 동적 링커를 지정해 주었는지 확인하고,
arm 링커 스크립트를 지정했는지 확인한다.
-Wl,-dynamic-linker,/system/bin/linker 를 추가.
-Wl,-T,~/donut/build/core/armelf.x 추가
Makefile에 위 내용을 추가해 빌드하면 된다.
자세한 설명은 리눅스 ELF 관련 검색하거나 GCC 링크 관련 자료를 찾아보면 된다.
간단히 정리한다면...
서로 다른 플랫폼에 대해 툴체인으로 크로스 컴파일을 하는경우
타겟 링커의 특성(어드레스 주소 구성방식 , 로딩방식)을 스크립트로 구현해 둔다.(elf.x)
호스트에서 빌드 시 해당 스크립트를 링커에게 알려 타겟 플랫폼의 링크 구조를 적용하게 된다..
음 이런건 걍 넘어가 주고 때 되믄 알게 된다는 무책임 주의라...
'프로그래밍 > Android' 카테고리의 다른 글
OpenCore Codec 연동 (0) | 2010.03.27 |
---|---|
GDB 기본환경 (0) | 2010.03.22 |
오픈코어 코덱 연동 시퀀스 (0) | 2010.03.18 |
오픈코어~오픈맥스 디코더 추가 (0) | 2010.02.23 |
안드로이드 플랫폼 포팅~holloworld 샘플 2 (0) | 2010.02.19 |
안드로이드 플랫폼 HelloWorld (0) | 2010.02.18 |
Android system 폴더에 쓰기 (0) | 2010.02.08 |
에뮬레이터에서 data,system 디렉토리 가져오기 (0) | 2010.02.04 |
JNI 기본사항 (0) | 2010.01.15 |
플랫폼 make/ 모듈 추가 방법 (0) | 2010.01.15 |