기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요. 아래 문제로 몇일째 고민을 하다가 여기까지 오게 되었습니다.ㅜㅜ
어플을 작성할때 libsctp.so 파일에 있는 관련 함수들을 사용해야 하는데.
문제는 android platform 에 맞게 컴파일된 libsctp.so 파일이 없다는 것입니다.
처음 리눅스 머신에서 테스트 할때는 잘 동작을 했기에,
당연히 android 에서도 동작을 할 줄 알았는데 ndk-build 할때 계속해서 아래의 에러가 나는 겁니다.
libsctp.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status
몇일동안 구글링해보니, 다른 bit 의 system 에서 작성되어 문제가 생기는 것 같습니다.
즉 ndk-build 할때는 32bit 로 컴파일된 .so 파일이 필요한데
저 파일은 64bit 로 컴파일이 되어 있어서 문제가 발생한게 아닌가 예상이 됩니다.
그리고 만약 32bit system 에서 저 파일을 만들어 사용을하면 문제가 없을까요?
두서없이 글을 적어서 죄송합니다.. 조언 부탁드립니다.ㅜㅜ
말씀하신데로 안드로이드용 라이브러리를 만드셔야 할 것 같습니다.
external/* 하위에 있는 녀석들을 참고 하시면 될 것 같네요.
libsctp.so 오픈 소스를 구하셔서
external/* 밑에 복사 하여 Android.mk make 문법을 이해하고 만드셔서
전체 빌드하시는 겁니다~
문제는 만약 libsctp 가 external/* 에 없는 다른 라이브러리의 함수를 호출하면
관련된 모든 라이브러리를 Android 용으로 만드셔야 합니다..
저도 예전에 한 프로그램을 실행하기 위해서 위와 같은 경험을 한 적이 있습니다.
한번 참고해 보세요 ^^;
1. 현재 올리신 것은 아마도 x86용 라이브러리 일 듯 하고요.
2. 일단 http://lksctp.sourceforge.net/ 요기 가셔서 lksctp-tools-1.0.11.tar.gz 다운로드 하신 후
3. configure 스크립트를 이용해서 arm용으로 Makefile을 만드신 후 컴파일을 함 해봅니다.
4. 컴파일 하면서 컴팔 로그를 dump 뜨신 후
5. 컴파일이 잘 되면
6. 해당 디렉토리를 android 소스의 external 디렉토리로 옮기시고
7. 덤프뜬 로그를 보면서 필요한 file들의 리수투를 만듭니다(list)
8. 로그를 욜라 잘 보면서..........file list들과 include 디렉토리들을 다 정리하신 후
9. Android.mk 파일을 만드시면 됩니다.
이 부분은 인터넷 찾으면 엄청 나오니, 제가 example을 드리는 것은 지금 제 상태............메롱......된 상태로는 불가능합니다....ㅠ.ㅠ
10. 컴팔 해 봅니다.
안드로이드에서 mm 명령을 이용해서요....
자세한 문서는 요길 참조......
http://www.aesop.or.kr/Board_Documents_Android_Frameworks/70831
11. 에러가 나면 일일이 조집니다.....^^
가끔, bionic C library와 glibc 혹은 커널 버전 등에 따라 안되는 경우가 있습니다.
12. 잘되면 이제 제대로 테스트를 해 봅니다.
안될 경우도 있습니다. 이유는 bionic C가 좀 부실할 경우도 있어서 잘 동작 안하는 경우도 있습니다.
즉, 함수 이름은 있으나 내용이........휑......
if( 안될경우)
{
x86과 동작을 비교하면서 하나씩 조지러 들어가야 합니다.....
}
else
{
잘 되었으므로.........그냥 쓴다......
ret = delay(2days); // 윗분들한테는 보고하지 않고, 고생하는 것 처럼 하고 2일 잉여짓을 많이 한다.
if( ret == 0 )
{
printf("okay\n");
}
else
goto YingYeo_Fail;
}
return 0;
YingYeo_Fail:
욜라_욕_먹는다();
printf("그래도 일은 끝냈다\n);
return 0;
올려주신 툴체인으로 lksctp.so 를 arm 용으로 만들어서 정상적으로 빌드까지 마쳤습니다.
여기까지 한것만으로도 정말 감사드립니다.(쾌도난마님, 고도리님)
그런데 실제 단말에서 실행될때 아래와 같은 에러가 발생하네요..
java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1937]: 1908 could not load needed library 'libc.so.6' for 'libsctp.so'
아무래도 위에 쾌도난마님께서 말씀하신데로 libsctp.so 에서 호출하는 모든 라이브러리들을 android 용으로 작성해서 올려야 할 것 같은데 맞나요?
그래서 아래 명령어로 확인해보니
#arm-insignal-linux-gnueabi-objdump -p libsctp.so | grep NEEDED
NEEDED libc.so.6
밖에 없네요.
하~ 위 라이브러리만 있으면 될 것 같은데.. libc.so.6 은 어떻게 안드로이드 용으로 작성할 수 있을까요?
계속 질문드려서 죄송합니다..
일단, 제가 말씀드린 5번까지 된 것입니다.
지금서부터는 컴파일 정보를 재 구성해야할 때입니다.
즉, 안드로이드에서는 다른 libc를 쓰기 때문에, Android에 맞게 컴파일을 안드로이드 소스를 이용해서 하셔야 합니다.
여기서 결정해야할 것이...
1. static library를 만들것이냐?
2. shared library를 만들것이냐?
를 결정한 후에
http://www.aesop.or.kr/Board_Documents_Android_Frameworks/70831
자료의 24 page서부터의 자료를 참고로, 인터넷서 Android.mk에 대한 자료를 얻으셔야 합니다.
그 후에 Android.mk를 sctp library를 만들기 위하여 작성을 해 주신 후 android에서 컴팔하셔야 합니다.
지금까지 올려주신 자료로는 정확하게
1. android 어느버전?
2. 그냥 컴팔만?
등등의 의문점이 있습니다. 즉, 타겟 환경이 제대로 갖춰져 있지 않으면 더 설명드리는 것은 힘들다고 보여집니다.
제가 해 드리고 싶긴하지만,
안드로이드 컴파일 하려면 집 pc로는 24시간 정도가 걸릴 듯 하고(저번에 실제로 그랬음....ㅠ.ㅠ - vbox이용하니)
회사서 하기에도 대략 2시간 이상 정도가 걸릴 듯 합니다.
Android.mk를 만드시는 부분은 직접 어느정도 인터넷 자료를 가지고 만드셔야 할 듯 합니다.
Linux정도라면 그나마 쉽게 확인이 가능한데, 안드로이드는 머 하나 하려면 너~~~무 오래 걸립니다.... ㅠ.ㅠ
여하튼 libc.so.6는 안드로이드용으로 현재 라이브러라 만들어지지 않기 때문에 나오는 메세지고요.
안드로이드용으로 Android.mk 파일을 만드셔서, 안드로이드의 /external 디렉토리 밑에서 작업하시면 큰 문제없이 라이브러리가 생성될겁니다.
Android.mk 문법을 익히시고, 지금 라이브러리를 만들 때 사용된 source file list만 잘 나열해 주시면 금방 될겁니다.
고도리님 댓글 달아주셔서 감사드립니다. 지금 윗쪽에 달린 댓글을 몇번이고 읽었습니다. 그리고
이제야 조금씩 감을 잡기 시작했습니다.^^
일단 저의 개발환경은 ubuntu 10.04 에서 Android ICS 4.0.3 소스를 기준으로 개발을 하고 있습니다.
말씀해주신대로 lksctp make 시에 로그를 떴구요, 거기서 libsctp.so 를 생성하는 부분만 위에 붙여봤습니다. 계속 보고 있어도 아리송 아리송하네요; 이제 저걸 기준으로 android.mk 를 만들어서 extern/ 밑에 필요 파일들과 함께 넣어서 안드로이드 풀 빌드를 돌리면 제가 필요로 하는 lksctp.so 파일이 생성 될 것 같은데 맞는 생각인가요?^^;
아흑 오늘까지 빌드성공해야 하는데.. android.mk 파일 만드는것도 난감하네요 ㅜㅜ
고도리님 정말 정말 감사합니다..
http://www.aesop.or.kr/index.php?mid=Board_Resources_General&document_srl=86161
참고하세요.........제가 도와드릴 수 있는 한계는 여기까지입니다.
libstcp.so가 pc용인듯 하네요.
안드로이드용으로 빌드하세요.