Repository: rust
Issue: Program cross compiled for mips-unknown-linux-musl crashes with SIGILL
Labels: O-MIPS,C-bug

cc @Bigomby @alexcrichton

Originally reported as japaric/rust-cross#27

Original report below:

---

Hi, I'm trying to cross compile a Rust app for LEDE (fork of OpenWRT) but I'm stuck.

The application is just an `hello_world` example:

```rust
fn main() {
    println!("Hello, world");
}
```

These are the steps I performed:

1. In first place I downloaded the LEDE SDK and compiled successfully the image and the toolchain for my device (`mips-openwrt-linux-musl-gcc`).
2. Install the Rust std using `rustup add mips-unknown-linux-musl`.
3. Create a `.cargo/config` file in my project with the following content:

    ```
    [target.mips-unknown-linux-musl]
    linker = "mips-openwrt-linux-musl-gcc"
    ```
4. Build the app using `cargo build --release --target=mips-unknown-linux-musl`.
5. Deploy the executable to the device using `scp`.
6. Got `Illegal instruction`

**On target**
```bash
$ ldd hello_world
/lib/ld-musl-mips-sf.so.1 (0x558c2000)                                                 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x77cc4000)                                       
libc.so => /lib/ld-musl-mips-sf.so.1 (0x558c2000)  

$ ldd --version
musl libc (mips-sf)
Version 1.1.15
Dynamic Program Loader
Usage: ldd [options] [--] pathname
```

**On host**
```bash
$ mips-openwrt-linux-musl-gcc -v
Reading specs from /opt/lede/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15/bin/../lib/gcc/mips-openwrt-linux-musl/5.4.0/specs
COLLECT_GCC=mips-openwrt-linux-musl-gcc
COLLECT_LTO_WRAPPER=/opt/lede/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15/bin/../libexec/gcc/mips-openwrt-linux-musl/5.4.0/lto-wrapper
Target: mips-openwrt-linux-musl
Configured with: /home/diego/source/build_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15/gcc-5.4.0/configure --with-bugurl=http://www.lede-project.org/bugs/ --with-pkgversion='LEDE GCC 5.4.0 r2032' --prefix=/home/diego/source/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15 --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=mips-openwrt-linux-musl --with-gnu-ld --enable-target-optspace --disable-libgomp --disable-libmudflap --disable-multilib --disable-libmpx --disable-nls --without-isl --without-cloog --with-host-libstdcxx=-lstdc++ --with-float=soft --with-gmp=/home/diego/source/staging_dir/host --with-mpfr=/home/diego/source/staging_dir/host --with-mpc=/home/diego/source/staging_dir/host --disable-decimal-float --with-mips-plt --with-diagnostics-color=auto-if-env --disable-libssp --enable-__cxa_atexit --with-headers=/home/diego/source/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15/include --disable-libsanitizer --enable-languages=c,c++ --enable-shared --enable-threads --with-slibdir=/home/diego/source/staging_dir/toolchain-mips_mips32_gcc-5.4.0_musl-1.1.15/lib --enable-lto --with-libelf=/home/diego/source/staging_dir/host
Thread model: posix
gcc version 5.4.0 (LEDE GCC 5.4.0 r2032)
```

## Disabling jemalloc

If I use rust nightly and disable jemalloc as following:

```rust
#![feature(alloc_system)]
extern crate alloc_system;

fn main() {
    println!("Hello, world");
}
```

Then it works! But as I keep adding code the application eventually crashes with another `Illegal instruction`. For example:

**Works**
```rust
TcpStream::connect("130.206.193.115:80").unwrap();
```

**Does not work**
```rust 
TcpStream::connect("google.com:80").unwrap();'
```

I don't know what I'm doing wrong. Any help will be appreciated.