LINUX.ORG.RU
ФорумMobile

Запуск бинарников для android в chroot

 , , ,


0

1

Собрал Cyanogenmod 7.2 с целью выпилить init, чтобы запускать его в chroot (хочу сделать портативную сборку android для запуска в chroot).

Выяснилось, что даже busybox в chroot не запускается, вылетает с ошибкой сегментирования.

Статические бинарники при запуске из корня работают, но при запуске из chroot ошибка сегментирования их настигает довольно быстро: путём добавления отладочно-трассировачных строк

printf("<function name>");
при каждом вызове функций выяснилось, что ошибка сегментирования происходит между вызовом одной из функций и первой её строкой.

Динамически слинкованные вылетают сразу при загрузке libc (виноват linker)

Так, как linker собран статически, попробывал запустить его из корня:

xecve("/android-chroot/root/system/bin/linker", ["/android-chroot/root/system/bin/"...], [/* 40 vars */]) = 0

set_tls(0xb0013d48, 0x1, 0xb0014870, 0, 0xb0012f7c) = 0
getpid()                                = 1744

sigaction(SIGILL, {0xb0005bfd, [], SA_RESTART}, {SIG_DFL, [], 0}, 0) = 0

....... остальные sigaction

sigaction(SIGPIPE, {0xb0005bfd, [], SA_RESTART}, {SIG_DFL, [], 0}, 0) = 0

--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xffffff60} ---

Далее идёт обработчик для sigsegv, который снова рушится уже без обработки.
Результат не зависит от аргументов и места запуска. gdb пробовал приаттачить, но у него с chroot проблемы, к тому же несмотря на сборку в отладочном режиме отладочные символы почему-то отсутствуют (ну это же android).

P.S Код функции main линкера:

int main(int argc, char **argv)
{
    return 0;
}
ЧТО ТУТ МОЖЕТ ПРИВЕСТИ К SIGSEGV???????

P.P.S в коде linker есть ассемблерный файл, вызывающий _linker_init. При попытке дописать туда printf ругается:

ERROR: malloc called from the dynamic linker!

По крайней мере это означает, что хоть что-то работает.

Ещё могу добавить, что не вылетает adb, хотя работоспособность проверить тоже не могу т.к отстутствует модуль g_android.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 5)

Расположение данных в TLS...

На самом деле, проблема давно решена. Есть патч к bionic (libc в андроиде) и библиотека libhybris, что позволяет запускать бинарники от андроида под линуксом, и вызывать код из разделяемых библиотек.

https://github.com/libhybris/libhybris

http://www.cnx-software.com/2013/04/21/how-to-use-libhybris-and-android-gpu-l...

alexst
()
Ответ на: комментарий от alexst

Не нашёл способов применения кроме использования драйверов android и подгрузки отдельных библиотек. Да и в коде hybris есть только реализация переноса отдельных библиотек. Мне нужна работа всего android в chroot, наличие glibc в нём не предполагается.

Можете подробнее объяснить, что же мешает bionic запускаться в chroot?

Ядро наполовину андройдовое (linux-sunxi). Даже система логов присутствует.

Встречал ранее в интернете упоминания успешного запуска андройда через chroot (там просто запускали chroot /path/to/android /init).

mittorn ★★★★★
() автор топика

Возможные проблемы:

1. Ты не пробросил в чрут устройства, поэтому некоторые приложения, которые к ним обращаются, могут не работать.

2. Что-то ты не так собрал.

3. Ещё что-нибудь.

Лучше всего в чрут поставь всю базовую систему.

Quasar ★★★★★
()
Ответ на: комментарий от Quasar

Устройства на месте, сборка должна быть рабочей (из этих же исходников на armv5 под андройдом запускалась)

mittorn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.