Termuxという、非rootで使えるLinux CUI環境というかアプリがある。 これで興味深いのはパッケージ管理システムが提供されていて、clangが入れられる。 (なお、gccは提供されていない)

"Hello, world."コンパイルと実行の様子

これは本当にARM aarch64なELFバイナリファイルを生成している。

Termuxの仕組みは/data/data/com.termux/files/をprefixとした環境になっているので、 /data/data/com.termux/files/usr/libにいろいろな共有ライブラリ(dynamic library)がある。

ところで、上で作ったhelloファイルが必要とする共有ライブラリは、libdl.solibc.soなのだが、 /data/data/com.termux/files/usr/libには存在しなかった。 調べてみたところ、/system/lib/libdl.so/system/lib/libc.soを参照しているようであった。 つまり、システムで使えるものは使う方針のようだ。

adbからアクセスできる/data/local/tmp/にコピーしたら、非Termux環境で使えた。

方法は以下の通り。

一旦Termuxでsdcard領域に退避させる。

$ pwd
/data/data/com.termux/files/home
$ cp hello storage/shared

これをadbから/data/local/tmp/にコピーする。これはsdcard領域では実行権限が付与できないからである。

$ adb shell
$ cp /sdcard/hello /data/local/tmp
$ chmod +x /data/local/tmp/hello
$ /data/local/tmp/hello
Hello, world.
$

しかし実用的にはPC上でクロスコンパイルしたほうがうんと楽であろうから、 単なる小ネタではある。