Robert Dailey
2019-Nov-05 21:29 UTC
Segmentation fault using rsync client on Android device
I've compiled rsync for my rooted Android (armeabi-v7a, 32-bit) device using these instructions: ``` clone_or_update rsync master git://git.samba.org/rsync.git cd rsync ./prepare-source ./configure \ --prefix=$INSTALL_ROOT/rsync \ --host=$AUTOCONF_PLATFORM \ CFLAGS="$CFLAGS -static" make -j8 && make install cd - ``` Best place for instructions to build I could find were here: https://stackoverflow.com/a/18032833/157971 I didn't get any compiler or linker errors. It seemed to work. I copied the `bin/rsync` executable to the device in the `/data` directory. I then executed this command: ``` ./rsync -vvvvvvvv --stats --progress -rdt rsync://192.168.1.205:12000 ``` I get this output: ``` opening tcp connection to 192.168.1.205 port 12000 Connected to 192.168.1.205 (192.168.1.205) Segmentation fault ``` Not much to go on. I tried running the same command via rsync in cygwin and it worked fine: ``` FILE_STRUCT_LEN=24, EXTRA_LEN=4 opening tcp connection to 192.168.1.205 port 12000 Connected to 192.168.1.205 (192.168.1.205) msg checking charset: UTF-8 sending daemon args: --server --sender -vvvvvvvvtre.iLsfxC . / (5 args) ziosk Ziosk Content Files ``` Can anyone help me understand why rsync is crashing on Android? Note that I compiled rsync using the Android NDK (r20). I set up the environment (CC, LD, etc) to point to the correct toolchain in the NDK. It's how I build all of my third party libraries as well, so I know at least as far as the environment goes, it's all set up correctly. Are there dependencies missing that could cause this problem? I did not provide any dependencies to rsync when I compiled it. Thanks in advance for any help. I'm stuck.
Robert Dailey
2019-Nov-07 16:59 UTC
Segmentation fault using rsync client on Android device
So I went through the effort of setting up gdbserver on my Android
device and using gdb to break when a segfault happens. The issue was
because if iconv. Apparently when cross compiling rsync, it
automatically picks up the iconv on the *HOST* system instead of
throwing an error. There's also apparently no explicit method of
telling the configure script where to find a cross-compiled iconv
library, so I had to manipulate CFLAGS / LDFLAGS to get it to work.
Here's the script I ran:
```
RSYNC_VERSION=rsync-3.1.3
download_and_untar $RSYNC_VERSION \
https://rsync.samba.org/ftp/rsync/$RSYNC_VERSION.tar.gz
cd $RSYNC_VERSION
./prepare-source
./configure \
--prefix=$INSTALL_ROOT/rsync \
--host=$AUTOCONF_PLATFORM \
CFLAGS="-I$INSTALL_ROOT/iconv/include $CFLAGS" \
LDFLAGS="-L$INSTALL_ROOT/iconv/lib $LDFLAGS"
make -j8 && make install
cd -
```
Prior to running the build for rsync, I cross-compiled iconv library
and installed it to `$INSTALL_ROOT/iconv`. From there, all I had to do
was tell rsync (via compiler flags) where to find it. I think an
option to autoconf would be better, something like
`--with-iconv=$INSTALL_ROOT/iconv` so it knows where to find the
includes & libs.
I'm able to run rsync on my device now without crashes.
On Tue, Nov 5, 2019 at 3:29 PM Robert Dailey <rcdailey.lists at gmail.com>
wrote:>
> I've compiled rsync for my rooted Android (armeabi-v7a, 32-bit) device
> using these instructions:
>
> ```
> clone_or_update rsync master git://git.samba.org/rsync.git
> cd rsync
> ./prepare-source
> ./configure \
> --prefix=$INSTALL_ROOT/rsync \
> --host=$AUTOCONF_PLATFORM \
> CFLAGS="$CFLAGS -static"
> make -j8 && make install
> cd -
> ```
>
> Best place for instructions to build I could find were here:
> https://stackoverflow.com/a/18032833/157971
>
> I didn't get any compiler or linker errors. It seemed to work.
>
> I copied the `bin/rsync` executable to the device in the `/data`
> directory. I then executed this command:
>
> ```
> ./rsync -vvvvvvvv --stats --progress -rdt rsync://192.168.1.205:12000
> ```
>
> I get this output:
>
> ```
> opening tcp connection to 192.168.1.205 port 12000
> Connected to 192.168.1.205 (192.168.1.205)
> Segmentation fault
> ```
>
> Not much to go on. I tried running the same command via rsync in
> cygwin and it worked fine:
>
> ```
> FILE_STRUCT_LEN=24, EXTRA_LEN=4
> opening tcp connection to 192.168.1.205 port 12000
> Connected to 192.168.1.205 (192.168.1.205)
> msg checking charset: UTF-8
> sending daemon args: --server --sender -vvvvvvvvtre.iLsfxC . / (5 args)
> ziosk Ziosk Content Files
> ```
>
> Can anyone help me understand why rsync is crashing on Android? Note
> that I compiled rsync using the Android NDK (r20). I set up the
> environment (CC, LD, etc) to point to the correct toolchain in the
> NDK. It's how I build all of my third party libraries as well, so I
> know at least as far as the environment goes, it's all set up
> correctly.
>
> Are there dependencies missing that could cause this problem? I did
> not provide any dependencies to rsync when I compiled it.
>
> Thanks in advance for any help. I'm stuck.
Maybe Matching Threads
- [PATCH node-image] Add ability to set persistent ssh_host_keys on the node, usefull if you run diskless instance of ovirt-node
- getaddrinfo.c error compiling rsync on tru64 5.1A
- Build-system cleanups
- [LLVMdev] LLVM 3.2 compilation with RTTI enabled
- Using centos and kickstart to build a minimum installation