리눅스 오픈 소스(Makefile.am)를 AOSP 소스에 적용하여 빌드 할 수 있는 방법?

bbyongi의 이미지

제가 Hikey960 레퍼런스 보드를 이용한 AOSP android-9.0 소스를 빌드하는 개발환경이 있습니다.
https://source.android.com/setup/build/devices#hikey960

//ubuntu 환경에서 Hikey960용 AOSP 소스 다운로드
$ repo init -u https://android.googlesource.com/platform/manifest -b master
$ repo sync -j8

위와 같이 AOSP 소스를 내려받은 후에, 아래 과정으로 Hikey960 이미지를 빌드하면
Hikey960 보드에서 정상적으로 안드로이드 Pie 9.0 동작을 확인 할 수 있었습니다.

//ubuntu 환경에서 Hikey960용 AOSP 소스 빌드
$ . ./build/envsetup.sh
$ lunch hikey960-userdebug
$ make -j8

질문 드립니다.

질문: Makefile.am만 제공되는 리눅스 오픈 소스를 AOSP에 적용하여 빌드하는 방법?
목적: Android의 adb shell로 접속해서 mbimcli 라는 커맨드를 사용하고 싶습니다.

리눅스 오픈 소스인 libmbim(libmbim-1.18.0.tar.xz) 소스를 AOSP 9.0에 포팅하고 싶습니다.

https://www.freedesktop.org/wiki/Software/libmbim/
https://www.freedesktop.org/software/libmbim/libmbim-1.18.0.tar.xz

리눅스 오픈 소스인 libmbim-1.18.0.tar.xz 소스를 확인해보니 automake를 이용하는 Makefile.am만 존재하여
ubuntu 같은 리눅스 환경에서는 .configure 수행후에 make만 해주면 아주 쉽게 빌드가 되고 있습니다.

//ubuntu 환경에서 libmbim-1.18.0.tar.xz 빌드 확인

$ tar xvf libmbim-1.18.0.tar.xz
$ .configure
$ make

문제는 Hikey960 보드에 적용하기 위해 AOSP 소스에 libmbim-1.18.0.tar.xz를 포팅하려니
안드로이드 AOSP 소스는 Android.mk 또는 Android.bp 파일이 존재해야 make가 적용되는데
리눅스 오픈 소스인 libmbin은 Makefile.am만 존재하여 AOSP 소스에 적용해 빌드를 못하고 있습니다.

포팅하려는 목적은 Hikey960 보드 내에서 mbimcli 라는 shell program을 실행하고 싶은데
libmbim이 glib를 이용해서 구현되어 있는 상태라 AOSP 소스에 어떻게 맞물려야 빌드가 가능할지
Makefile.am를 어떻게 Android.mk로 바꿔줘야 할지를 모르겠습니다.

일주일정도 구글링이나 여러 삽질을 시도해봤으나 소득은 없고
더 이상 뭘 해봐야할지 몰라서 혹시나 하는 마음에 KLDP에 문의 드립니다.

stackoverflow에 동일한 질문을 구했는데 답변을 못받는거 보면 불가능한 작업을 질문한건지...
https://stackoverflow.com/questions/55116288

관련하여 아시는 분 계시면 도움을 부탁드립니다.

furmuwon의 이미지

해당하는 ARM arch version에 맞는 크로스 컴파일이 있을 겁니다.
(우분투에서 그냥 install 하셔도 되고..)
arm-gcc-...... hello_world.c -static -o
으로 빌드하시면 엄청 큰 실행 파일이 나오는데
이걸 adb 로 밀어 넣어서 chmod 하신 뒤 실행 하면 hello world 나올겁니다.

bbyongi의 이미지

말씀하신 hello world 출력하는 test app 추가는 Android.bp를 추가해서 시도해보고
실제 컴파일되서 Hikey960 보드 내에서 실행되는걸 확인 했습니다.

그런데 libmbim 오픈 소스가 glib를 이용해서 구현된 프로그램이라 그런지
리눅스 오픈 소스를 AOSP내에 어떻게 밀어 넣어서 빌드를 해야할지 감이 안잡히네요.
Makefile.am를 Android.mk로 바꾸는 방법이 없는지 질문 드렸습니다.

furmuwon의 이미지

너무 ABC 가 빠진 답변 이었네요.

일반 리눅스 어플 및 라이브러리를 안드로이드에 포팅하려고 하시는 거고,
너무커고 복잡하고 잘 모르기 때문에 엄두가 안 나시는 거잖아요.

hello_world 를 예를 든 것은
Android.mk 를 이용하여 안드로이드에서 실행 한것은 바이오닉 C 를 이용한 것이고
우분투에서 컴파일한 hello_world 를 안드로이드에서 돌리고 싶다면?
(=바이오닉C를 를 이용하지 않는 방법)
실행파일에 glibc를 함께 물고 있으면 됩니다.
즉, static으로 컴파일 하란 말 이었습니다.

생각하시는 libmbim 가 있고 만약 test_mbim 이 있다면
test_mbim 을 + glibc + libmbim 을 함께 포함하고 있는 실행 파일을 만들면(=static 으로 빌드)
바이오닉 C 를 사용하지 않으므로, 안드로이드에서 바로 실행 가능합니다.

furmuwon의 이미지

인터넷에 좋은 예제가 있네요
https://www.androidtcpdump.com/android-tcpdump/compile
libpcap = libmbim
tcpdump = test_mbim
이렇게 대입하셔서 보시면 될 것 같습니다.

bbyongi의 이미지

조언해주심에 정말 감사드립니다.

사용하는 Hikey960 보드를 확인해보니 Coretex ARM 기반의 aarch64에 해당되고 있습니다.

알려주신 링크와 https://blog.thinkbee.kr/linux/crosscompile-arm/ 링크를 참고해서
Hikey960 보드에 맞는 gcc-aarch64-linux-gnu 컴파일러를 설치하고 난 후에

https://www.freedesktop.org/software/libmbim/libmbim-1.18.0.tar.xz 소스를 압축풀어서
./configure --host=aarch64-linux-gnu를 실행해보니 aarch64-linux-gnu-gcc로 컴파일되도록
config 설정이 되었습니다.

< configure reulst message >

libmbim 1.18.0
==============================================

Build:
compiler: aarch64-linux-gnu-gcc
cflags: -Wall -std=gnu89 -g -O2 -Wmissing-declarations -Wmissing-prototypes -Wdeclaration-after-statement -Wstrict-prototypes -fno-strict-aliasing -Wno-deprecated-declarations -Wint-to-pointer-cast -Wfloat-equal -Wno-unused-parameter -Wno-sign-compare -Wunused-but-set-variable -Wundef -Wimplicit-function-declaration -Wpointer-arith -Winit-self -Wshadow -Wmissing-include-dirs -Waggregate-return -Wformat-security -Wtype-limits -Werror
ldflags:
Maintainer mode: yes
Documentation: no
...(생략)

그 다음 make를 수행해보니 "ld: cannot find -lglib-2.0" 빌드 에러가 발생하네요.

리눅스 오픈 소스인 libmbim이 glib를 이용해서 개발된거라고 하는데
sudo apt-get install libmbim-glib-dev 으로 ubuntu에 x86-x64용 glib는 설치되어 있어서
libmbim-1.18.0.tar.xz 소스를 .configure -> make 수행하면 정상적으로 make를 성공하고 있습니다.

그런데 cross-compile을 위해서 ./configure --host=aarch64-linux-gnu 를 적용하고
make를 수행하면 ld: cannot find -lglib-2.0 에러가 발생하네요.

< make error message > /usr/lib/gcc-cross/aarch64-linux-gnu/4.8/../../../../aarch64-linux-gnu/bin/ld: cannot find -lglib-2.0 collect2: error: ld returned 1 exit status

-lglib-2.0 에러를 해결해보고자 검색을 더 해보고 삽질해봤는데
아래와 같이 /usr/lib/x86_64-linux-gnu/libglib-2.0.so이 존재하고 있습니다.

$ pwd
/usr/aarch64-linux-gnu/bin

$ sudo ld -lglib-2.0 --verbose
==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libglib-2.0.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libglib-2.0.a failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libglib-2.0.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libglib-2.0.a failed
attempt to open //usr/local/lib64/libglib-2.0.so failed
attempt to open //usr/local/lib64/libglib-2.0.a failed
attempt to open //lib/x86_64-linux-gnu/libglib-2.0.so failed
attempt to open //lib/x86_64-linux-gnu/libglib-2.0.a failed
attempt to open //lib64/libglib-2.0.so failed
attempt to open //lib64/libglib-2.0.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libglib-2.0.so succeeded
-lglib-2.0 (//usr/lib/x86_64-linux-gnu/libglib-2.0.so)
libpcre.so.3 needed by //usr/lib/x86_64-linux-gnu/libglib-2.0.so
found libpcre.so.3 at //lib/x86_64-linux-gnu/libpcre.so.3
libpthread.so.0 needed by //usr/lib/x86_64-linux-gnu/libglib-2.0.so
found libpthread.so.0 at //lib/x86_64-linux-gnu/libpthread.so.0
libc.so.6 needed by //usr/lib/x86_64-linux-gnu/libglib-2.0.so
found libc.so.6 at //lib/x86_64-linux-gnu/libc.so.6
ld-linux-x86-64.so.2 needed by //lib/x86_64-linux-gnu/libpthread.so.0
found ld-linux-x86-64.so.2 at //lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address

지금 "ld: cannot find -lglib-2.0" 빌드 에러가 발생하는 상황이
cross-compile을 위한 aarch64-linux-gnu용 glib-2.0를 구해서 설치해야 하는걸까요?

아니면 링크시 -lglib-2.0를 위한 lib path등을 어떻게 설정해줘야 이 에러를 넘어갈수 있을까요?

Coretex ARM 기반의 aarch64용 aarch64-linux-gnu으로 컴파일시에
ld: cannot find -lglib-2.0 에러를 어떻게 해결할수 있는지
아시면 조언을 부탁드립니다.

처음 해보는 부분이라 계속 막히고 삽질하는게 일주일을 넘어가니 너무 어렵고 힘드네요.

감사합니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon make_error_log.zip3 KB
Package icon libmbim-1.18.0.zip463.93 KB
furmuwon의 이미지

그 툴체인에 glib 가 없어서 그런것 같고요
(아마도 glib 를 물고 있는 암용 툴체인은 없을듯?)
그럼 먼저 arm 용 glib를 컴파일 하셔야 겠습니다.
구글 검색 "glib arm cross compile"
그리고 위치 알려주고~ 다시 원하시는 라이브러리 컴파일~

이제 부터
아마도 mbim 이 물고 있는 라이브러리가 있으면 다 arm용으로 준비 하여야 할 겁니다.
예를 들면 구글에 "gdb arm cross compile"
검색하시면 android 에 gdb 를 static으로 올리려고 하는데
연관된 라이브러리가 없어서 그 라이브러리를 arm 용으로 만들어서 하는 방법이 있습니다.

아마도 세계 최초로 안드로이드에서 mbim 을 시도해보시는 것 같은데..
많은 시행착오와 노가다가 있을 겁니다.
연관된 라이브러리를 모두 arm 용으로... 준비하여야 하니깐요

target 에 올리는 놈은
x86용 라이브러리든 실행 파일은 필요 없습니다
arm용 라이브러리든 실행파일이 모두 필요합니다~
요것만 생각해 보시면 이제 x86 관련하여서는 찾아보실 필요 없을 것입니다~
(대신 어떻게 링크 위치 하여야 되는 것은 참고해 볼 필요는 있습니다)

bbyongi의 이미지

답변해주셔서 정말 감사합니다.

static으로 cross-compile해서 AOSP에 밀어넣는 방향으로 진행하고 있는데
어렴풋 libmbim 말고도 glib도 ARM(aarch64)로 cross-compile 해야하는게 아닌가 생각하고
긴가 민가하면서 glib를 cross-compile 하는 방법을 뒤져보고 있었는데...

libmbim 컴파일과 실행에 필요한 모든게 ARM(aarch64)용으로 cross-compile 되야한다는 명쾌한 답변 감사합니다.
답변주신걸 차근 차근 읽어보고 세계 최초의 libmbim 포팅이라는 말에 눈앞이 깜깜해지네요.
일단 목표는 잡혔으니 구멍이 뚤릴때까지 더 삽질을 해보겠습니다.

bushi의 이미지

https://git.congatec.com/yocto/meta-openembedded/blob/bfeed31834bf394950bd96424a22df7119359f51/meta-oe/recipes-connectivity/libmbim/libmbim_1.12.2.bb
4년 전.

굉장히 복잡한 의존성을 가진 뭔가를 static 빌드해야한다면, yocto 가 편합니다.

덧:

대충 대강 시험만 어떻게든 해보는거라면, 빌드된 것가져다 적당히 잘 버무려 쓰셔도 되고요.
예를 들면
https://packages.ubuntu.com/cosmic/arm64/libglib2.0-dev/filelist
https://packages.ubuntu.com/cosmic/arm64/libmbim-glib-dev/filelist
-dev 혹은 -devel 패키지들은 헤더 파일들을 다 가지고 있고, 어지간한 라이브러리들은 .a 도 dev 패키지로 제공하니 한번 섞어보세요.

익명 사용자의 이미지

그런데 무슨 일을 해야 하기에 안드로이드에서 libmbim이 필요한 건가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.