티스토리 뷰

Linux C 에서 arm 크로스 컴파일 시 system() 함수 사용하기

 

흔히 컴퓨터에서 쓰는 Intel CPU 와 휴대폰의 ARM CPU 에서 사용하는 어셈블리어가 다르기 때문에 컴퓨터에서 작성한 프로그램이 폰에 심어 제대로 작동하기 위해서는 arm 크로스 컴파일러를 이용하여 컴파일하여야 한다.

 

그런데 sendevent 처럼 이벤트 보내기 등을 위하여 system() 함수를 쓰려고하면 제대로 동작하지 않는다.

그 이유는 system() 함수는 리눅스에서 내부적으로 /bin/sh 를 호출하여 인자값을 처리하도록 한다.

하지만 안드로이드는 /system/bin/mksh 가 쉘의 위치이다.

 

제대로 동작을 시키기 위해서는 안드로이드에 /bin에 sh 라는 쉘을 만들어주거나 system() 함수를 직접 만드는 방법이 존재한다.

심볼릭링크를 이용하여 /bin/sh를 만들어주는 것이 매우 간편한 해결책이다.

 

하지만 안드로이드의 최상위 디렉토리인 / 은 read only 로 마운트 되어있기 때문에 read write 로 리마운트 시켜줘야 /bin 이라는 폴더를 생성할 수 있다.

mount -o remount, rw [리마운트할 디렉토리] 명령어를 치면 디텍토리를 rw 로 마운트 시킬수있다.

 

$ mount -o remount, rw /

로 리마운트를 시켜주면 이제 mkdir /bin 을 생성하면 정상적으로 폴더가 생성되어진다.

그럼 이제 심볼릭 링크를 이용하여 /bin/sh 를 만들면된다.

 

$ ln -s /system/bin/mksh /bin/sh

그림처럼 안드로이드의 쉘을 가르키는 /bin/sh 가 만들어졌다.

이제 크로스 컴파일 시킨 프로그램이 제대로 system() 함수를 제대로 작동시킬 것이다.

댓글