I write enclave code strictly in `no_std` and use `hashbrown` as one of the 
transitive dependencies. However, it fails to compile after upgrading 
`hashbrown` to 0.11. It fails at linker step with the following messages:

<details>
<pre>
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::error::os_err':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/error.rs:96:
 undefined reference to `__xpg_strerror_r'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::util_libc::open_readonly':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/util_libc.rs:110:
 undefined reference to `open64'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::use_file::getrandom_inner::{{closure}}':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/use_file.rs:36:
 undefined reference to `read'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::use_file::wait_until_rng_ready':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/use_file.rs:104:
 undefined reference to `poll'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::use_file::wait_until_rng_ready::{{closure}}':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/use_file.rs:99:
 undefined reference to `close'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::use_file::Mutex::lock':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/use_file.rs:124:
 undefined reference to `pthread_mutex_lock'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::use_file::Mutex::unlock':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/use_file.rs:128:
 undefined reference to `pthread_mutex_unlock'
/usr/local/bin/ld: 
target/debug/libenclave.a(getrandom-1afbd7620d110fa6.getrandom.3csxlzm7-cgu.0.rcgu.o):
 in function `getrandom::imp::getrandom':
/home/USER/.cargo/registry/src/github.com-1ecc6299db9ec823/getrandom-0.2.2/src/linux_android.rs:45:
 undefined reference to `syscall'
collect2: error: ld returned 1 exit status
</pre>
</details>

The pitfall comes from that `hashbrown 0.11` depends on `getrandom 0.2`. And 
`getrandom` despite being a `no_std` library will always use Linux syscall if 
the target triple is `*-linux-*`. See [its 
document](https://docs.rs/getrandom/0.2.2/getrandom/) for more detail.

Ultimately, I think this just shows a fundamental issue that we tell rust to 
build enclave code in `x86_64-unknown-linux-gnu` target when in reality we are 
actually using something like `x86_64-unknown-none-eabi`. As such, `getrandom` 
got the wrong impression that we are on Linux and it is safe to use Linux 
syscall.

Of course, we can fork and patch `getrandom`. But IMHO, patching crates for sgx 
are red herring in terms of maintenance, stability, or even security (as bug 
fixes in upstream may not be applied in time). Not mentioning it splits the eco 
systems. I also believe it is infeasible to patch every crates whenever we 
encounter similar issues. So my question is whether there is a better systemic 
approach to address the underlying issue.

Thanks.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/apache/incubator-teaclave-sgx-sdk/issues/326

Reply via email to