Альтернативы Entware на Андроид

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 08 фев 2018, 14:05

Тема предназначена для обсуждения альтернативных способов доставки нужных бинарей и библиотек на Андроид-устройство, особенно таких, которых в пакетах Entware нет.

Из простых решений нужно упомянуть Termux с ограничением на версию Андроида (только 5.0 и новее), но его обсуждение здесь хотелось бы избежать (для этого есть тема на одном популярном ресурсе).

Другим простым решением является полноценный Linux-дистрибутив в chroot (например, Linux Deploy). См. также тему на этом форуме. Но chroot есть chroot, он не всегда удобен: требуется монтировать интерфейсы ядра /dev, /proc, /sys и пользовательские данные в контейнер. Следующее сообщение (перенесенное из другой темы) как раз посвящено одному из способов "вывернуть" такой chroot наизнанку, сохранив суть. Другим способом такого "выверта" на мой взгляд можно назвать и Entware.

Обсуждение самостоятельной сборки бинарников приветствуются. Но у меня есть сомнения, что здесь стоит обсуждать сборку бинарников с помощью Android NDK. Лично я просто это никогда не делал, но если у кого-то есть дельные инструкции, как собирать с помощью него продвинутые пакеты программ, типа полноценной samba4, не мучаясь с созданием bionic-патчей на каждом этапе сборки всех нужных библиотек, то милости просим. Имеется также неприятная особенность Android NDK - собранный бинарник для одной версии Андроида может перестать работать на следующей версии, Google так любит делать.

Visitor7
Сообщения: 2
Зарегистрирован: 15 янв 2018, 01:09

Сообщение Visitor7 » 08 фев 2018, 14:16

Перенесенное сообщение от 17.01.2018.

kaztost, Приветствую. Нашел вас по ссылке с 4pda, хочу куда-нить скрипт свой для андроида пристроить, тут вроде место и люди малость подходящие. В лс меня пока не пускает, распишу тут, а вы уж скажите, нужно не нужно и куда. Не нужно, стирайте.
 
Началось все с того, что я поставил entware на андроид и радовался. Но недавно мне понадобился strace aarch64, ентваровский 32-х битный мне netd убивал. Скачал из репозитария дебиана. Потом не нашел нужной утилиты sslscan. Тоже скачал из дебиана. В итоге автоматизировал это дело, получилось подобие пакетного менеджера. Пользуюсь в довесок к ентвари.

Код: Выделить всё

/ # debi
Updating package list...
Connecting to ftp.debian.org (130.89.148.12:80)
.packages.gz.main.pt 100% |****|  9977k  0:00:00 ETA
Connecting to ftp.debian.org (130.89.148.12:80)
.packages.gz.contrib 100% |****| 58520   0:00:00 ETA
Connecting to ftp.debian.org (130.89.148.12:80)
.packages.gz.non-fre 100% |****| 75937   0:00:00 ETA
Updating list done.

Preinstallation...
Downloading libc6...
Connecting to ftp.debian.org (130.89.148.12:80)
libc6_2.26-3_armhf.d 100% |****|  2340k  0:00:00 ETA
Installing libc6 8455KB (libgcc1) GNU C Library: Shared libraries
Downloading libgcc1...
Connecting to ftp.debian.org (130.89.148.12:80)
libgcc1_7.2.0-19_arm 100% |****| 37388   0:00:00 ETA
Installing libgcc1 153KB (gcc-7-base libc6) GCC support library
Downloading gcc-7-base...
Connecting to ftp.debian.org (130.89.148.12:80)
gcc-7-base_7.2.0-19_ 100% |****|   179k  0:00:00 ETA
Installing gcc-7-base 242KB () GCC, the GNU Compiler Collection (base package)
Downloading patchelf...
Connecting to ftp.debian.org (130.89.148.12:80)
patchelf_0.9-1+b1_ar 100% |****| 50474   0:00:00 ETA
Installing patchelf 111KB (libc6 libgcc1 libstdc++6) modify properties of ELF executables
Downloading libstdc++6...
Connecting to ftp.debian.org (130.89.148.12:80)
libstdc++6_7.2.0-19_ 100% |****|   330k  0:00:00 ETA
Installing libstdc++6 1476KB (gcc-7-base libc6 libgcc1) GNU Standard C++ Library v3
Preinstallation done.

debi: argument needed
Debian package manager for android. Only for simple packages that don`t need to be configured. Needs "deb", "undeb" and "debcfg" scripts in PATH written directory. In first run libc library will be preinstalled.
  PKG  - package name
  REGEX  - simple sed regex
  w  - without depends
  n  - names only
  o  - update package list only
  a  - again (redownload or reinstall)
Install package:
  debi [-w] [-a] PKG|REGEX [PKG|REGEX...]
Remove package:
  debi -r [-w] PKG [PKG...]
    without arguments - remove only all unused
    auto-installed dependencies
Search package:
  debi -s [-n] PKG|REGEX [PKG|REGEX...]
View package info:
  debi -i PKG|REGEX [PKG|REGEX...]
View installed package files:
  debi -f PKG [PKG...]
List installed packages:
  debi -l [-n]
Update packages:
  debi -u [-o]
Reinstall all:
  debi -z
Disk usage:
  debi -d
Clean cache:
  debi -c
Change execution method:
  debi -e script|symlink|patch [DirForSymlinks]
    without arguments - view current
Get package (download only):
  debi -g [-a] PKG [PKG...]
Extract package (send to undeb):
  debi -x PKG [undeb_args]
      d  - extract to dir, by default debian root
      c  - control files instead of data files
      v  - verbose
      o  - to stdout
    Extract files:
      debi -x PKG [-c] [-v] [-d DIR|-o]
    Extract specified files:
      debi -x PKG -e [-c] [-v] [-d DIR|-o] FILE [FILE...]
    List files:
      debi -x PKG -t [-c] [-v]
    Show control:
      debi -x PKG -s
         sort form of -x PKG -eco ./control
5|/ #
5|/ # debi -l
libc6 2.26-3 8455KB p (libgcc1)
libgcc1 1:7.2.0-19 153KB a (gcc-7-base libc6)
gcc-7-base 7.2.0-19 242KB a ()
patchelf 0.9-1+b1 111KB p (libc6 libgcc1 libstdc++6)
libstdc++6 7.2.0-19 1476KB a (gcc-7-base libc6 libgcc1)
/ # debi -d
54528   /deb/
5904    /deb/_dist/.cache/
152     /deb/_dist/.controls/
19704   /deb/_dist/.packages.gz
24      /deb/etc/
9256    /deb/lib/
19456   /deb/usr/
/ # debi -s ssl.*
>> ssl-cert 1.0.39 63KB (debconf openssl adduser)
simple debconf wrapper for OpenSSL
>> ssl-cert-check 3.30-1 41KB (openssl)
proactively handling X.509 certificate expiration
>> ssldump 0.9b3-7 72KB (libc6 libpcap0.8 libssl1.1)
SSLv3/TLS network protocol analyzer
>> sslh 1.18-1 131KB (libc6 libcap2 libconfig9 libwrap0 debconf init-system-helpers adduser lsb-base update-inetd)
Applicative protocol multiplexer
>> sslscan 1.11.5-rbsec-1.1 67KB (libc6 libssl1.0.2)
Fast SSL scanner
>> sslsniff 0.8-6 245KB (libboost-filesystem1.62.0 libboost-system1.62.0 libboost-thread1.62.0 libc6 libgcc1 liblog4cpp5v5 libssl1.0.2 libstdc++6)
SSL/TLS man-in-the-middle attack tool
>> sslsplit 0.5.0+dfsg-2+b1 171KB (libc6 libevent-2.1-6 libevent-openssl-2.1-6 libevent-pthreads-2.1-6 libssl1.1)
transparent and scalable SSL/TLS interception
>> sslstrip 0.9-1 140KB (python-twisted-web python)
SSL/TLS man-in-the-middle attack tool
/ # debi sslscan
Downloading sslscan...
Connecting to ftp.debian.org (130.89.148.12:80)
sslscan_1.11.5-rbsec 100% |****| 28374   0:00:00 ETA
Installing sslscan 67KB (libc6 libssl1.0.2) Fast SSL scanner
Downloading libssl1.0.2...
Connecting to ftp.debian.org (130.89.148.12:80)
libssl1.0.2_1.0.2n-1 100% |****|   893k  0:00:00 ETA
Installing libssl1.0.2 1998KB (libc6 debconf) Secure Sockets Layer toolkit - shared libraries
/ # debi -f sslscan
./
./usr/
./usr/bin/
./usr/bin/sslscan
./usr/share/
./usr/share/doc/
./usr/share/doc/sslscan/
./usr/share/doc/sslscan/changelog.Debian.gz
./usr/share/doc/sslscan/changelog.gz
./usr/share/doc/sslscan/copyright
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/sslscan.1.gz
/ # where sslscan
/deb/usr/bin/sslscan  -->  /data/local/debian/usr/bin/sslscan
/ # sslscan mozilla.org
Version: 1.11.5
OpenSSL 1.0.2n  7 Dec 2017

OpenSSL version does not support SSLv2
SSLv2 ciphers will not be detected

OpenSSL version does not support SSLv3
SSLv3 ciphers will not be detected
Testing SSL server mozilla.org on port 443

  TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
OpenSSL version does not support compression
Rebuild with zlib1g-dev package for zlib support

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  AES128-GCM-SHA256       
Accepted  TLSv1.2  128 bits  AES128-SHA256           
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-GCM-SHA256     DHE 2048 bits
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA256       Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-SHA256         DHE 2048 bits
Accepted  TLSv1.2  128 bits  AES128-SHA              
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-SHA            DHE 2048 bits
Accepted  TLSv1.2  256 bits  AES256-GCM-SHA384       
Accepted  TLSv1.2  256 bits  AES256-SHA256           
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-GCM-SHA384   Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  DHE-RSA-AES256-GCM-SHA384     DHE 2048 bits
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA384       Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  DHE-RSA-AES256-SHA256         DHE 2048 bits
Accepted  TLSv1.2  256 bits  AES256-SHA              
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  DHE-RSA-AES256-SHA            DHE 2048 bits
Preferred TLSv1.1  128 bits  AES128-SHA              
Accepted  TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  DHE-RSA-AES128-SHA            DHE 2048 bits
Accepted  TLSv1.1  256 bits  AES256-SHA              
Accepted  TLSv1.1  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  256 bits  DHE-RSA-AES256-SHA            DHE 2048 bits
Preferred TLSv1.0  128 bits  AES128-SHA              
Accepted  TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  DHE-RSA-AES128-SHA            DHE 2048 bits
Accepted  TLSv1.0  256 bits  AES256-SHA              
Accepted  TLSv1.0  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  256 bits  DHE-RSA-AES256-SHA            DHE 2048 bits

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  mozilla.org
Altnames: DNS:mozilla.org, DNS:www.mozilla.org
Issuer:   DigiCert SHA2 Extended Validation Server CA
Not valid before: Nov  9 00:00:00 2016 GMT
Not valid after:  Nov 14 12:00:00 2018 GMT
/ # 
Скрипт состоит из 4-х файлов, которые нужно расположить под соответствующими именами в любой папке ,записанной в PATH, и задать атрибуты исполнения.
undeb - распаковщик
debcfg - конфиг для deb и debi
deb - запуск непатченных бинарников
debi - менеджер пакетов
Для работы скриптов нужны busybox и архиватор ar (есть в mifik busybox и в entware). В debcfg нужно, как минимум, вписать подходящую архитектуру. В init.d/su.d для постоянной работы нужно добавить создание симлинка на папку установки, изначально /data/local/debian -> /deb. Если пользоваться простым запуском патченных бинарников(exec method patch), то папки debian с бинарниками нужно занести в PATH в /system/etc/mkshrc или /*.rc.

debcfg:

Код: Выделить всё

#!/system/bin/sh

## Configuration file for debi/deb scripts.
# v3.2

# Working root debian directory
root=/deb

# Real root debian directory
realroot=/data/local/debian

# Debian server. See https://www.debian.org/mirror/list
server=http://ftp.debian.org

# Debian distribution. See https://www.debian.org/releases/
dist=unstable

# Architecture, ex. arm64, mips, armel, armhf etc.
# See https://wiki.debian.org/SupportedArchitectures
# Find one of binary-{arch} in http://ftp.debian.org/debian/dists/unstable/main/
arch=armhf

# Subfolder for working data and downloads
distfold="_dist"

# Lib C package for preinstallation
glibc="libc[0-9.]*"

# Other packages for preinstallation
prepkgs="patchelf"

# Method to exec binaries: script, symlink, patch
# script: only using a script, run as "deb COM ARGS"
# symlink: put named symlink on deb to $dirforsym
# patch: patch with patchelf for normal execution, you need to add $path to PATH.
exectype=symlink

# The folder where symlinks are created, if the symlink method is selected
dirforsym=/system/xbin

# Caching parameter: never, normal, always
# never: remove deb archives after installation
# normal: remove deb archives after package removing
# always: don`t remove, always leave deb archives
caching=normal

if [ -f "$root/$distfold/.debarch" ];then

   # Load "ld" (ld.so name), "libarch" (arch specified lib subfolder name) and "lib" (arch specified lib folder name) variables. Generated by debi automaticly based on libc package data.
   . "$root/$distfold/.debarch"

# Reload "exectype" and "dirforsym" variables. Generated by debi automaticly based on user choice.
   [ -f "$root/$distfold/.debexec" ]&&
      . "$root/$distfold/.debexec"

   # Library directory list
   ldpath="$root/$lib/$libarch:$root/usr/$lib/$libarch"

fi

# Binary directory list
path="$root/bin:$root/bin/bb:$root/usr/bin:$root/sbin:$root/usr/sbin"

# Exclude this packages from autoinstall as a depends
pkgpull="debconf debconf-2.0"

# Variable list
debvars="root realroot server dist arch distfold exectype dirforsym ld libarch lib ldpath path pkgpull debvars glibc prepkgs caching"
deb:

Код: Выделить всё

#!/system/bin/sh

## Debian binary launcher.
# v3.2

. debcfg||exit 1

ld="$root/$lib/$libarch/$ld"
args="--inhibit-cache --library-path $ldpath"
name="${0##*/}"

getpath() {
   local PATH="$path"
   com="$(type "$1")"||exit 1
   com="/${com#*/}"
}

if [ "$name" != deb ];then
   getpath "$name"
   set "$ld" $args "$com" "$@"
elif [[ "$1" = [!-/]* ]];then
   getpath "$1"
   shift
   set "$ld" $args "$com" "$@"
elif [[ "$1" = --* && "$2" = [!-/]* ]];then
   key="$1"
   getpath "$2"
   shift 2
   set "$ld" $args "$key" "$com" "$@"
else
   set "$ld" $args "$@"
fi

#PATH=".:$path:$PATH"
#LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH:$ldpath "
#export PATH LD_LIBRARY_PATH

unset $debvars args name com key
unset -f getpath

exec "$@"
undeb:

Код: Выделить всё

#!/system/bin/sh

## Распаковка deb-пакетов.
# v3.2

u=${0##*/};[ ! "$u" -o "$u" = sh -o "$u" != "${u%[!.]sh}" ]&&u=undeb;
unset v o dir list show ext cont err strs

mhelp() {
echo -e "Deb package extractor.
usage: $u [-c] [-v] [-o|-d OUTDIR] PACKAGE [PACKAGE...]
       $u -e [-c] [-v] [-o|-d OUTDIR] PACKAGE FILE [FILE...]
       $u -t [-c] [-v] PACKAGE [PACKAGE...]
       $u -s PACKAGE [PACKAGE...]
o  - extract to stdout
d  - extract to dir, by default \$PWD
e  - extract only specified files
c  - control files instead of data files
v  - verbose
t  - list files
s  - show control 
        short form of -eco PKG ./control
h  - this help";}

[[ "$1" = \-h || "$1" = \-\-help ]]&&{ mhelp;exit; }

err() {
err="$1";local e
case $1 in
1)e="commands needed:\n$2";;
2)e="argument needed for option -- $2";; 
3)e="invalid option -- $2";;
4)e="package not specified";;
5)e="$2: not found";;
6)e="$2: unknown archive";;
esac;
echo "$u: $e" >&2;[ "$4" ]&&mhelp;[ "$3" ]||exit $1;}

et=$(type ar tar|grep ' not found')&&err 1 "$et"

while getopts ":cevtsod:" opt;do
   case "$opt" in
      v)v="-v";;
      o)o="-O";;
      c)cont=1;;
      s)show=1;;
      t)list=1;;
      e)ext=1;;
      d)dir="-C \"$OPTARG\"";;
      :)err 2 "$OPTARG";;
      ?)err 3 "$OPTARG";;
   esac;
done;
shift $(($OPTIND-1))
[ "$1" ]||err 4 '' '' help

args="-x $v $o $dir"
[ "$cont" ]&&
   pac="control.tar"||
      pac="data.tar"

if [ "$list" ];then
   args="-t $v"
elif [ "$ext" ];then
   file="$1";shift
   for str in "$@";do
      strs="$strs \"$str\""
   done
   set "$file"
elif [ "$show" ];then
   args="-xO ./control"
   pac="control.tar"
fi

for file in "$@";do
   [ -f "$file" ]||{ err 5 "$file" noexit;continue; }
   pac="$(ar -t "$file"|grep "$pac")"
   case "${pac##*.}" in
      xz)pk='-J';;
      gz)pk='-z';;
      *)err 6 "$file" noexit;continue;;
   esac
   eval "ar -p \"$file\" \"$pac\"|tar $pk $args $strs"
done

exit $err
debi:

Код: Выделить всё

#!/system/bin/sh

## Установщик пакетов из репозитария debian на андроид. Только для простых и не требующих конфигурирования утилит. Для работы нужны скрипты deb, undeb и debcfg в папке прописанной в path.
# v3.1

u=${0##*/};[ ! "$u" -o "$u" = sh -o "$u" != "${u%[!.]sh}" ]&&u=debi;

cl=$'\e[1;34m';
cr=$'\e[0m';
nl=/dev/null

mhelp() {
echo -e "Debian package manager for android. Only for simple packages that don\`t need to be configured. Needs \"deb\", \"undeb\" and \"debcfg\" scripts in PATH written directory. During the first run libc library will be preinstalled.
  PKG  - package name
  REGEX  - simple sed regex
  w  - without depends
  n  - names only
  o  - update package list only
  a  - again (redownload or reinstall)
Install package:
  $u [-w] [-a] PKG|REGEX [PKG|REGEX...]
Remove package:
  $u -r [-w] PKG [PKG...]
    without arguments - remove only all unused
    auto-installed dependencies
Search package:
  $u -s [-n] PKG|REGEX [PKG|REGEX...]
View package info:
  $u -i PKG|REGEX [PKG|REGEX...]
View installed package files:
  $u -f PKG [PKG...]
List installed packages:
  $u -l [-n]
Update packages:
  $u -u [-o]
Reinstall all:
  $u -z
Disk usage:
  $u -d
Clean cache:
  $u -c
Change execution method:
  $u -e script|symlink|patch [DirForSymlinks]
    without arguments - view current
Get package (download only):
  $u -g [-a] PKG [PKG...]
Extract package (send to undeb):
  $u -x PKG [undeb_args]
      d  - extract to dir, by default debian root
      c  - control files instead of data files
      v  - verbose
      o  - to stdout
    Extract files:
      $u -x PKG [-c] [-v] [-d DIR|-o]
    Extract specified files:
      $u -x PKG -e [-c] [-v] [-d DIR|-o] FILE [FILE...]
    List files:
      $u -x PKG -t [-c] [-v]
    Show control:
      $u -x PKG -s
         short form of -x PKG -eco ./control";}

[[ "$1" = \-h || "$1" = \-\-help ]]&&{ mhelp;exit; }

err() {
err="$1";local e
case $1 in
2)e="commands needed:\n$2";;
3)e="argument needed for option -- $2";; 
4)e="invalid option -- $2";;
5)e="argument needed";;
6)e="$2: package not exist";;
7)e="$2: package file not exist";;
8)e="$2: package file already exist";;
9)e="Connection error";;
10)e="$2: package not installed";;
11)e="Extraction error";;
12)e="$2: binary not symlinked";;
13)e="$2: binary not patched";;
14)e="$2: package already installed";;
15)e="$(echo $2): too many packages";;

esac;
echo "$u: $e" >&2;[ "$4" ]&&mhelp;[ "$3" ]||exit $1;}

. debcfg||exit 1
packagefile="$root/$distfold/.packages.gz"
et=$(type ar tar find zcat gzip gunzip wget du sed deb undeb|grep ' not found')&&err 2 "$et"

com=install
unset nodepends namesonly updateonly again
while getopts ":rifsluzegxdcwnoa" opt;do
   case "$opt" in
      r)com=remove;;
      z)com=reinstall;;
      x)com=extract;;
      g)com=get;;
      e)com=exec;;
      u)com=update;;
      l)com=list;;
      i)com=info;;
      f)com=files;;
      s)com=search;;
      d)com=size;;
      c)com=clear;;
      w)nodepends=1;;
      n)namesonly=1;;
      o)updateonly=1;;
      a)again=1;;
      :)err 3 "$OPTARG";;
      ?)err 4 "$OPTARG";;
   esac
done
shift $(($OPTIND-1))

preinit() {
   [ -d "$realroot" ]||mkdir "$realroot"
   [ -w "$realroot" ]||exit 1
   if [ ! -e "$root" ];then
      mnt="$(grep '^rootfs .* rw,' /proc/mounts)";
      [ "$mnt" ]||mount -o remount,rw /
      ln -s "$realroot" "$root"
      [ "$mnt" ]||mount -o remount,ro /
   fi
   [ -e "$root" ]||exit 1
   [ -d "$root/$distfold" ]||mkdir "$root/$distfold"
   [ -d "$root/$distfold/.controls" ]||
      mkdir "$root/$distfold/.controls"
   [ -d "$root/$distfold/.cache" ]||
      mkdir "$root/$distfold/.cache"
   [ -f "$packagefile" ]||updatelist
   [ -f "$packagefile" -a ! -f "$root/$distfold/.debarch" ]&&preinstall
}

updatelist() {
   local pkg
   echo "Updating package list..."
   [ -f "$packagefile.n" ]&&rm "$packagefile.n"
   for pkg in main contrib non-free;do
      [ -f "$packagefile.$pkg.ptm" ]&&
         rm "$packagefile.$pkg.ptm"
      wget -O "$packagefile.$pkg.ptm" "$server/debian/dists/$dist/$pkg/binary-$arch/Packages.gz"||err 9
   done
   zcat $root/$distfold/.*.gz.*.ptm|gzip -f >"$packagefile.n"||exit 1
   rm $root/$distfold/.*.gz.*.ptm
   [ -f "$packagefile" ]&&rm "$packagefile"
   mv "$packagefile.n" "$packagefile"
   echo "Updating list done.\n"
}

preinstall() {
   local pkg 
   echo "Preinstallation..."
   for pkg in "$glibc" $prepkgs;do
      installpkg pre "$pkg"||exit 1
   done
   getinfo ext "$glibc"
   libarch=$(sed -nr "s/^\.\/lib[0-9]*\/([^\/]*-linux-[^\/]*)\/$/\1/p" "$pkgdir/files")
   lib=$(sed -nr "s/^\.\/(lib[0-9]*)\/[^\/]*-linux-[^\/]*\/$/\1/p" "$pkgdir/files")
   ld=$(sed -nr "s/\.\/lib[0-9]*\/(ld-[^/ ]*\.so[^/ ]*)$/\1/p" "$pkgdir/files")
   echo "libarch=$libarch\nld=$ld\nlib=$lib" >"$root/$distfold/.debarch"
   echo "exectype=$exectype\ndirforsym=$dirforsym" >"$root/$distfold/.debexec"
   . debcfg
   for pkg in $prepkgs;do
      postinstall "$(getdir "$pkg")"
   done
   echo "Preinstallation done.\n"
}

getdir() {
   local pkgdir is
   for pkgdir in $(find "$root/$distfold/.controls" -mindepth 1 -type d -name "*");do
      grep -qE "^Package:[ \t]+$(subst "$1")[ \t]*$" "$pkgdir/control"&&{ is=1;break; }
   done
   [ "$is" ]&&
      echo "$pkgdir"||
         { err 10 "$1" noexit;return 10; }
}

getpkgdeps() {
   echo "$pkginfo"|sed -nr "/^Depends:/{s/\([^(]+\)//g;s/(^|,)([^,|]+)\|[^,]+(,|$)/ \2 /g;s/[ \t,]+/ /g;s/ $//;s/^Depends: (.+)$/\1/p}"
}

getinfo() {
   if [ "$1" = int ];then
      unset pkguri
      pkgdir="$(getdir "$2")"||return
      pkginfo="$(cat "$pkgdir/control")"
      pkgfile="$root/$distfold/.cache/${pkgdir##*/}"
   elif [ "$1" = ext ];then
      pkginfo=$(gunzip -c "$packagefile"|sed -n "/^Package:[ \t]\+$2[ \t]*$/{:l;p;n;s/^[ \t]*$//p;Tl;}")
      pkguri=$(echo "$pkginfo"|sed -nr "s/^Filename:[ \t]+(.+)[ \t]*$/\1/p")
      pkgfile="$root/$distfold/.cache/${pkguri##*/}"
      pkgdir="$root/$distfold/.controls/${pkgfile##*/}"
   fi
   [ "$pkginfo" ]||{ err 6 "$2" noexit;return 6; }
   [ "$3" = nodetails ]&&return
   pkgname=$(echo "$pkginfo"|sed -nr "s/^Package:[ \t]+(.+)[ \t]*$/\1/p")
   echo "$pkgname"|grep -c ".*"|grep -vq "^1$"&&
      { err 15 "$pkgname" noexit;return 15; }
   pkgver=$(echo "$pkginfo"|sed -nr "s/^Version:[ \t]+(.+)[ \t]*$/\1/p")
   pkgsize=$(echo "$pkginfo"|sed -nr "s/^Installed-Size:[ \t]+(.+)[ \t]*$/\1/p")
   pkgstate=$(echo "$pkginfo"|sed -nr "s/^State:[ \t]+([^- ]+)-installed[ \t]*$/\1/p")
   pkgdesc=$(echo "$pkginfo"|sed -nr "/^Description:/{s/^Description:[ \t]+(.+)[ \t]*$/\1/;:l;p;n;s/^[^ :]+: //;Tl;} }")
   pkgdep="$(getpkgdeps)"
}

subst() {
   echo "$1"|sed "s/+/\\\+/g;s/\[/\\\[/g;s/\]/\\\]/g;s/\*/\\\*/g;"
}

isinstalled() {
   echo "$installed"|grep -qE "(^| )$(subst "$1")(:| |$)"
}

isemptyfold () {
   if [ -d "$1" ];then
      ls -a "$1"|grep -vEq "^[ \t.]*$"||
         return 0
   fi
   return 1
}

checkserver() {
   wget -qO- "$server/debian/" >$nl||
      err 9
}

getpkg() {
   getinfo ext "$1"||return
   { [ "$again" -a "$com" = get ]&&
      [ -f "$pkgfile" ]&&checkserver; }&&
         rm "$pkgfile"
   if [ ! -f "$pkgfile" ];then
     echo "Downloading $pkgname..."
     wget -P "$root/$distfold/.cache" "$server/debian/$pkguri"||
        err 9
   else return 8
   fi
}

installpkg() {
   local deps dep err
   if [ ! "$again" ];then
      getinstalled
      isinstalled "$2"&&return 14
   else removepkg "$2"
   fi
   getpkg "$2"
   err="$?"
   [ "$err" = 0 -o "$err" = 8 ]||return "$err"
   pkgpull="$pkgpull $pkgname"
   if [ ! -f "$pkgdir/files" -o "$again" ];then
      echo "Installing $cl$pkgname$cr ${pkgsize}KB ($pkgdep) $pkgdesc"
      undeb -d "$root" "$pkgfile"||err 11 "$pkgfile"
      [ -d "$pkgdir" ]||mkdir "$pkgdir"
      undeb -s "$pkgfile" >"$pkgdir/control"
      [ "$(cat "$pkgdir/control")" ]||
         echo "$pkginfo"  >"$pkgdir/control"
      echo "State: $1-installed" >>"$pkgdir/control"
      undeb -t "$pkgfile" >"$pkgdir/files"
      postinstall "$pkgdir"
      [ "$caching" = never ]&&
         rm "$pkgfile"
   fi
   [ "$nodepends" ]&&return 0
   again=
   for dep in $pkgdep;do
      echo "$pkgpull"|grep -Eq "(^| )$(subst "$dep")( |$)"||
         deps="$deps $dep"
   done
   for dep in $deps;do
      installpkg auto "$dep"
   done
   return 0
}

removepkg() {
   local file pkgdir
   pkgdir="$(getdir "$1")"||return
   echo Removing $1
   preremove "$pkgdir"
   for file in $(grep "[^/]$" "$pkgdir/files");do
      [ -h "$root/${file:2}" -o -e "$root/${file:2}" ]&&
         { rm -f "$root/${file:2}"||exit 1; }
   done
   for file in $(grep "/$" "$pkgdir/files"|sort -r);do
      isemptyfold "$root/${file:2}"&&
         rmdir "$root/${file:2}"
   done
   [ -f "$root/$distfold/.cache/${pkgdir##*/}" -a ! "$again" -a "$caching" != always -a ! "$2" ]&&
      rm "$root/$distfold/.cache/${pkgdir##*/}"
   [ -d "$pkgdir" ]&&rm -rf "$pkgdir"
}

searchpkg() {
   if [ "$namesonly" ];then
      gunzip -c "$packagefile"|
         sed -n "/^Package:[ \t]\+$1[ \t]*$/{
            s/^Package: \(.*\)$/\1/p}"|
               grep ".*"||
                  { err 6 "$1" noexit;return 6; }
      return
   fi
   gunzip -c "$packagefile"|sed -n "
   /^Package:[ \t]\+$1[ \t]*$/{
      s/^Package: \(.*\)$/>> $cl\1$cr/
      h
      :l
      n
      /^Version:/{
         s/^Version: \(.*\)$/\1/
         H
         bl;}
      /^Installed-Size:/{
         s/^Installed-Size: \(.*\)$/\1KB/
         H
         bl;}
      /^Depends:/{
         s/([^(]\+)//g
         s/^Depends: \(.*\)$/\1/
         s/\(^ *\|,\)\([^,|]\+\)|[^,]\+\(,\| *$\)/\1\2\3/g
         s/[ \t,]\+/ /g
         s/ $//
         s/^ //
         s/^\(.*\)$/(\1)/
         H
         bl;}
      /^Description:/{
         s/^Description: \(.*\)$/\1/
         x
         s/\n/ /g;
         p
         x
         p
         b;}
      /^SHA256:/b;
      /^[ \t]*$/b;
      bl;
   }"|grep ".*"||
         { err 6 "$1" noexit;return 6; }
}

preremove() {
   local file IFS deb
   IFS=$'\n'
   if [ "$exectype" = symlink ];then
      deb="$(getdeb)"||return 1
      for file in $(getbinfiles "$1");do
         file="$dirforsym/${file##*/}"
         isfilesym "$file" "$deb"&&rm "$file"
      done
   fi
}

isfilesym() {
   ls -la "$1"|grep -qE "^l.*->[ \t]+($(subst "${2##*/}")|$(subst "$2"))[ \t]*$"
}

postinstall() {
   [ "$ld" ]||return
   local file IFS deb
   IFS=$'\n'
   if [ "$exectype" = patch ];then
      for file in $(getbinfiles "$1");do
         patchbin "$file"
      done
   elif [ "$exectype" = symlink ];then
      deb="$(getdeb)"||return 1
      for file in $(getbinfiles "$1");do
         ln -s "$deb" "$dirforsym/${file##*/}"||
            err 12 "$file" noexit
      done
   fi
}

getbinfiles() {
   local file files IFS
   IFS=$'\n'
   for file in $(cat "$1/files");do
      [ "$file" = "${file%/}" ]||continue
      file="$root/${file#./}"
      echo "$path"|
         grep -Eq "(^|:)$(subst "${file%/*}")(:|$)"&&
            [ -f "$file" ]&&
               files="$files$IFS$file"
   done
   echo "${files:1}"
}

patchbin() {
   local int out bin
   bin="$1"
   int="$root/$lib/$ld"
   deb --verify "$1"||return
   out="$(deb patchelf --print-interpreter --print-rpath "$1")"||return 1
   [ "$out" = "$int"$'\n'"$ldpath" ]&&return
   if [ "${1##*/}" = patchelf ];then
      bin="$1.m.tmp"
      cp "$1" "$bin"
   fi
   deb patchelf --set-interpreter "$int" --force-rpath --set-rpath "$ldpath" "$bin" 2>$nl||
      err 13 "$bin" noexit
   if [ "${1##*/}" = patchelf ];then
      rm "$1"
      mv "$bin" "$1"
   fi
}

cleansyms() {
   local file
   find "$1" -maxdepth 1 -mindepth 1 -type l|
      while read file;do
         isfilesym "$file" "$2"&&
            { rm "$file"||echo $file not unlinked; }
      done
}

getdeb() {
   local deb
   deb="$(type deb)"||return 1
   echo "/${deb#*/}"
}

getinstalled() {
   local dep pkgdir pkgname pkginfo pkgstate pkgdep
   unset installed alldepends
   for pkgdir in $(find "$root/$distfold/.controls" -mindepth 1 -type d -name "*");do
      pkginfo="$(cat "$pkgdir/control")"
      pkgname=$(echo "$pkginfo"|
         sed -nr "s/^Package:[ \t]+(.+)[ \t]*$/\1/p")
      pkgstate=$(echo "$pkginfo"|sed -nr "s/^State:[ \t]+([^- ]+)-installed[ \t]*$/\1/p")
      if [ "$1" = user ];then
         [ "$pkgstate" = user ]&&
            installed="$installed $pkgname"
      elif [ "$1" = auto ];then
         [ "$pkgstate" = auto ]&&
            installed="$installed $pkgname"
         pkgdep="$(getpkgdeps)"
         for dep in $pkgdep;do
            echo "$alldepends"|
               grep -qE "(^| )$(subst "$dep")( |$)"||
                  alldepends="$alldepends $dep"
         done
      else
         installed="$installed $pkgname:$pkgstate"
      fi
   done
}

heavejunk() {
   local pkg wasrm
   wasrm=1
   while [ "$wasrm" ];do
      getinstalled auto
      wasrm=
      for pkg in $installed;do
         if ! echo "$alldepends"|
            grep -qE "(^| )$(subst "$pkg")( |$)";then
               removepkg "$pkg"
               wasrm=1
         fi
      done
   done
}

preinit

if [ "$com" = extract ];then
   { getinfo int "$1"||getinfo ext "$1"; }||exit 6
   shift
   [ -f "$pkgfile" ]||err 7 "$pkgfile"
   unset keys files
   for arg in "$@";do
      [[ "$arg" = -* ]]&&keys="$keys $arg"
      [[ "$arg" = ./* ]]&&files="$files \"$arg\""
   done
   eval "undeb -d \"$root\" $keys \"$pkgfile\" $files"
elif [ "$com" = search ];then
   for pkg in "$@";do
      searchpkg "$pkg"
   done
elif [ "$com" = get ];then
   for pkg in "$@";do
      getpkg "$pkg"
      [ "$?" = 8 ]&&err 8 "$pkg" noexit
   done
elif [ "$com" = info ];then
   getinstalled
   for pkg in "$@";do
      isinstalled "$pkg"&&
         getinfo int "$pkg" nodetails||
            getinfo ext "$pkg" nodetails
      [ "$?" = 0 ]&&echo "$pkginfo\n"
   done
elif [ "$com" = files ];then
   getinstalled
   for pkg in "$@";do
      isinstalled "$pkg"&&
         cat "$(getdir "$pkg")/files"||
            err 10 "$pkg" noexit
   done
elif [ "$com" = list ];then
   for pkgdir in $(find "$root/$distfold/.controls" -mindepth 1 -type d);do
      pkginfo="$(cat "$pkgdir/control")"
      getinfo
      [ "$namesonly" ]&&
         echo "$pkgname"||
            echo "$cl$pkgname$cr $pkgver ${pkgsize}KB ${pkgstate:0:1} ($pkgdep)"
   done
elif [ "$com" = remove ];then
   for pkg in "$@";do
      removepkg "$pkg"||err="$?"
   done
   [ "$nodepends" ]||heavejunk
elif [ "$com" = update ];then
   updatelist
   [ "$updateonly" ]&&exit
   getinstalled
   oldpkgs=
   echo Comparing versions...
   for pkg in $installed;do
      getinfo ext "${pkg%:*}"
      epkgver="$pkgver"
      getinfo int "${pkg%:*}"
      if [ "$epkgver" != "$pkgver" ];then
         echo "${pkg%:*} ver. curr: $pkgver repo: $epkgver"
         oldpkgs="$oldpkgs $pkg"
      fi
   done
   caching_="$caching"
   if [ "$oldpkgs" ];then
      for pkg in $oldpkgs;do
         removepkg "${pkg%:*}" force
         installpkg "${pkg#*:}" "${pkg%:*}"
      done
      heavejunk
      echo Updating done.
   else
      echo Up to date.
   fi
elif [ "$com" = reinstall ];then
   echo Preparing...
   checkserver||exit
   getinstalled user
   pkgreinstall="$installed"
   echo Cleaning syms...
   deb="$(getdeb)"||exit 1
   cleansyms "$dirforsym" "$deb"
   echo Cleaning root...
   for file in $(find -L "$root" -maxdepth 1 -mindepth 1);do
      [ -e "$file" -o -h "$file" ]&&rm -rf "$file"
   done
   ld=
   preinit
   for pkg in $pkgreinstall;do
      installpkg user "$pkg"
   done
   echo "\nReinstallation done."
elif [ "$com" = exec ];then
   [ "$1" = script -o "$1" = symlink -o "$1" = patch ]||
      { echo $exectype $dirforsym;exit; }
   if [ "$2" ];then
      [ -d "$2" -a -w "$2" ]||exit 1
      ndirforsym="$2"
   else
      ndirforsym="$dirforsym"
   fi
   deb="$(getdeb)"||exit 1
   cleansyms "$dirforsym" "$deb"
   echo "exectype=$1\ndirforsym=$ndirforsym" >"$root/$distfold/.debexec"
   [ "$1" = script ]&&exit
   IFS=":"
   for dir in $path;do
      IFS=$'\n'
      find -L "$dir" -maxdepth 1 -mindepth 1 -type f 2>$nl|while read file;do
         if [ "$1" = patch ];then
            patchbin "$file"
         elif [ "$1" = symlink ];then
            ln -s "$deb" "$ndirforsym/${file##*/}"||
               err 12 "$file" noexit
         fi
      done
   done
elif [ "$com" = install ];then
   [ "$1" ]||err 5 '' '' help
   for pkg in "$@";do
      installpkg user "$pkg"
      [ "$?" = 14 ]&&err 14 "$pkg" noexit
   done
elif [ "$com" = size ];then
   for file in "$root/" "$root/$distfold/.cache/" "$root/$distfold/.controls/" "$packagefile" $(find -L $root -maxdepth 1 -mindepth 1 ! -name "$distfold" -type d	-exec echo "{}/" \;);do
      eval du -Ls "$file"
   done
elif [ "$com" = clear ];then
   find -L $root/$distfold/.cache -name "*.deb" -exec rm {} \;
fi

true
exit $err
Скрипт всегда будет эксперементальным, потому что всегда нужно думать, что можно поставить так, а что нет. Для чего может быть окружение нужно подстроить. Скрипт сырой и необкатанный. Развивать я его не собираюсь, он мне всего для пятка утилит и нужен. Но мож кому пригодится.
Свернуть

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 08 фев 2018, 14:54

Перенесенное сообщение от 17.01.2018

Visitor7, добро пожаловать на этот форум!

Наверное, более подходящее место для ваших скриптов - ветка Устанавливаем Debian (chroot среду) по выбору и используем совместно с Entware. И, опять-таки по личным ощущениям, разворачивать deb-пакеты лучше стандартным образом через apt-get в chroot. А пользоваться без chroot, вызывая дебианный линкер с нужными опциями, как в ваших скриптах.

Так что если возражений с вашей стороны не последует - перемещу ваше сообщение в указанную ветку.

08.02.2018 P.S. Теперь сообщение в нужной теме.

Visitor7
Сообщения: 2
Зарегистрирован: 15 янв 2018, 01:09

Сообщение Visitor7 » 08 фев 2018, 14:56

Перенесенное сообщение от 17.01.2018

kaztost, Спасибо, я не против той темы, но для работы на роутерах скорее всего понадобится правка. apt-get хорош, но его установить еще надо с толпой зависимостей, а тут маленький, легко изменяемый скрипт. Я пользуюсь в режиме patch, тогда скрипт для запуска не нужен, но в chroot бинарники после patchelf уже не запустятся.

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 08 фев 2018, 14:59

Перенесенное сообщение от 18.01.2018

Visitor7, ок, потестируем пока на андроиде. Я про patchelf сразу не увидел. Сейчас посмотрел - знатная штуковина, оказывается. Надо бы patchelf вообще в статично собранном виде иметь.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1912
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 08 фев 2018, 15:45

Еще есть способ прикручивания Optware (RIP) на Android. Где видел - не помню.
По аналогии может быть можно и Optware-ng прикрутить.

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 08 фев 2018, 16:55

Zyxmon писал(а):Источник цитаты Еще есть способ прикручивания Optware (RIP) на Android. Где видел - не помню.
По аналогии может быть можно и Optware-ng прикрутить.


Да, там есть некоторые пакеты, которых в Entware нет. Я когда-то прикручивал, причем через стандартный инсталлятор. Там больше папок в корне надо создать, типа /tmp и возможно еще что-то. Причем установка обязана быть в бизибоксной PATH-среде.

Я думал, что проект Optware-ng тоже RIP, но сегодня вдруг
dropbear: 2015.68 -> 2017.75

Круто да?! Причем там альтернативный dropbear есть (тоже 2017.75), специально пропатченный для андроида, типа пароли там можно в опциях запуска сервера передать (лучше бы дали возможность передать passwd-файл).

Аватара пользователя
myxa781
Сообщения: 2
Зарегистрирован: 18 июл 2017, 14:42

Сообщение myxa781 » 08 фев 2018, 19:05

Visitor7, ха :) приветствую
в репу плюсачил (успел скачать до модерации)

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 08 фев 2018, 19:11

Visitor7 писал(а):Источник цитаты Я пользуюсь в режиме patch, тогда скрипт для запуска не нужен, но в chroot бинарники после patchelf уже не запустятся.

Вообще, использовать patchelf - очень здоровая идея. Статично собрал для armv7, кому надо - поделюсь. Эй, любители жаловаться на error: only position independent executables (PIE) are supported. Вот же решение! Затащить линкер и системные библиотеки из какого-нибудь Андроид 4.2.2 себе в папку, пропатчить свой бинарь на нестандартный линкер и запускать его с нужным LD_LIBRARY_PATH. Но конечно, бинари, работающие с Android API, могут не пойти, а обычные линуксовые - вполне.

Хорошо, когда есть возможность запускать сам бинарь, а не скрипт-обертку, вызывающий линкер. Но для этого (кроме самого патчения бинарника) надо играть с LD_LIBRARY_PATH. А эту переменную может активно использовать bionic-linker (как в Андроид 4.2.2). Во избежание подобных конфликтов я пересобрал линуксовый линкер с другой переменной, вместо LD_LIBRARY_PATH. Не знаю, как в glibc, но в musl там всего одну строчку поменять (да и процесс нативной компиляции musl на андроиде оказался быстрее, чем кросс-компиляция glibc на компьютере).

Но все равно остается проблема различных конфигов, лежащих в /etc, /usr и проч. Сейчас мучаю musl следующим: добавил новую функцию char * insprefix (static char *) в stdlib.h, которая выхватывает из окружения нужный префикс и добавляет его к аргументу. А в остальном коде меняю, например, "/etc/passwd" на insprefix("/etc/passwd"), добавляя также зависимость #include <stdlib.h>. Патчи для Entware могут служить неплохим ориентиром, что и как надо патчить в разных пакетах. Если все это продолжать, получится динамический вариант Entware - в разных окружениях может быть своя система, но хватит ли у меня терпения все это делать, хотя бы под свои нужды???

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 27 фев 2018, 01:15

Еще один вариант получения бинарников на андроид-устройстве - использование репозиториев Alpine Linux. Тамошний менеджер пакетов apk (существует и в статически собранном виде) имеет опцию --root, позволяющую устанавливать пакеты в нужную директорию, удовлетворяя все зависимости. Для этого я пересобрал динамически свою статическую коллекцию бинарников, добавив бинарники strace, ar, nm, strip, file, patchelf и apk. Архив лежит здесь, установка:

Код: Выделить всё

cd /data
tar -xzvf /sdcard/alp.tar.gz

Рабочее окружение:

Код: Выделить всё

export PATH=/data/alp/bin:/data/alp/sbin:/data/alp/usr/bin:/data/alp/usr/sbin:$PATH

Работа с dropbear, ssh и mc такая же как и раньше (с заменой /data/local/static на /data/alp).

Но теперь можно тянуть бинарники из репозитариев Alpine Linux. Приведу пример для бинарника wpa_supplicant (почему-то его нет в энтвари).
1. Установка базовой Alpine системы и добавление библиотечных путей:

Код: Выделить всё

apk -X http://dl-cdn.alpinelinux.org/alpine/latest-stable/main -U --allow-untrusted --root /data/alp/root/temp --initdb add alpine-base
echo "/data/alp/root/temp/lib:/data/alp/root/temp/usr/lib" >> /data/alp/etc/ld-musl-armhf.path

В папку /data/alp/root/temp уже можно чрутится, но мы этого делать не будем. Вместо этого мы указывали линкеру новые пути для поиска библиотек. Наш линкер пропатчен следующим образом: сначала он ищет по путям ALP_LIBRARY_PATH, потом по путям из /data/alp/etc/ld-musl-armhf.path, и если не найдет - использует вшитые пути /data/alp/lib:/data/alp/usr/local/lib:/data/alp/usr/lib.
2. Добавляем основные репозитории и устанавливаем wpa_supplicant со всеми зависимостями:

Код: Выделить всё

echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/main" > /data/alp/root/temp/etc/apk/repositories
echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /data/alp/root/temp/etc/apk/repositories
apk --root /data/alp/root/temp update
apk --root /data/alp/root/temp add wpa_supplicant

Для каких-то бинариков можно еще добавить репозитарий http://dl-cdn.alpinelinux.org/alpine/edge/testing.
3. Меняем линкер в бинарнике wpa_supplicant:

Код: Выделить всё

patchelf --set-interpreter /data/alp/lib/ld-musl-armhf.so.1 /data/alp/root/temp/sbin/wpa_supplicant

После данной операции бинарь /data/alp/root/temp/sbin/wpa_supplicant становится рабочим.

В общем случае новым бинарникам может потребоваться конфиги и временные файлы в /etc, /tmp или /var. Бинарники, которые уже есть в архиве пропатчены на работу внутри /data/alp.


Вернуться в «Entware на Android»

Кто сейчас на конференции

Всего 2 посетителя :: 0 зарегистрированных, 0 скрытых и 2 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя