cross-libc dlopen v0.1.0
Load the host's GPU drivers into a process that carries its own libc.
See the README
for what the two gaps are and which one your symptom is.
Built on glibc 2.31, which is the floor every artefact here is held
to. An object needing a symbol version above it would fail to load inside
a bundle whose glibc is older, so the build refuses to produce one and
the packaging step refuses to publish one.
Changes
First release. Everything in the repository at v0.1.0:
- Record that the branch merged, and that the release is unblocked and undone (#10)
- Make aarch64 real, add the release, and rewrite the front-door documents (#8)
- Initialize Project
What each artefact needs
Read from build-manifest.json, which is built from the objects
themselves and ships inside both archives.
aarch64
| artefact | max GLIBC_ |
SONAME | entry points | sha256 |
|---|---|---|---|---|
cross-libc-dlopen.so |
2.17 | n/a | 2 | 4b6864a26bb89a57f572c73bf7b0454b68dbb67c99ea8f5f86655d0928a10f72 |
gl-fwd.so |
2.17 | libGL.so.1 |
3470 | cc962c1012ae5a97914d814ec72abcda89dddf390f14c406c3e8853e444a4839 |
egl-fwd.so |
2.17 | libEGL.so.1 |
44 | 2d31c0502e2a96cc79aaa8970e09958455a1cbdc265717bee8db5aaf01c8aa8c |
gles-fwd.so |
2.17 | libGLESv2.so.2 |
358 | 322697c29696c9af0021beb8c7114624d31cb696955b8756f3918092d2b5e287 |
runtime-select |
2.17 | n/a | 0 | f1e64f85adca673c7bfec0429b65f2fe0800931f98118f36c68f53fdeb0ec1dc |
Compiler: aarch64-linux-gnu-gcc (Debian 10.2.1-6) 10.2.1 20210110
aarch64, portable variant
| artefact | max GLIBC_ |
SONAME | entry points | sha256 |
|---|---|---|---|---|
cross-libc-dlopen.so |
2.17 | n/a | 2 | 423ca9a3a660130b9e12c7273867fa6f77bf23911056d0b394baf5fd45524cb4 |
gl-fwd.so |
2.17 | libGL.so.1 |
3470 | 40744a3151fc1467aef7684a97f8221ba50996312e03844a672873bce9fcf238 |
egl-fwd.so |
2.17 | libEGL.so.1 |
44 | ddf401d53621dcf67f8ccaa65cf156767ca54a76e34388fb33e7daa1a7d4b6b7 |
gles-fwd.so |
2.17 | libGLESv2.so.2 |
358 | a66cebc39513de7b6035ca812a7f778e1047d06b381c6992ca674fa92e4ca117 |
runtime-select |
2.17 | n/a | 0 | 7996b44ee4ffd5dcc5f51fbf57fd891fea587e2b5164af4625aadaf7e277bf21 |
Compiler: aarch64-linux-gnu-gcc (Debian 10.2.1-6) 10.2.1 20210110
x86_64
| artefact | max GLIBC_ |
SONAME | entry points | sha256 |
|---|---|---|---|---|
cross-libc-dlopen.so |
2.16 | n/a | 2 | 2761cbf0715e099429803dd04b236851fd2d71fade039949edf344a00e93c410 |
gl-fwd.so |
2.14 | libGL.so.1 |
3470 | b4f3f3311833dc23149ce740fdd2b9c052b72d7711c0b1cec7514a64d4ddb01f |
egl-fwd.so |
2.14 | libEGL.so.1 |
44 | 3b9bf82d04c98adbe36a96c9ecf8cb621384eb1ab5cf46fc20196623ce963e4f |
gles-fwd.so |
2.14 | libGLESv2.so.2 |
358 | c502d8d344edac7549e6c9afc1de16fd411db38bf69eb880db283de2d792e04c |
runtime-select |
2.14 | n/a | 0 | 31eb619d0a8c73e3e212157d5d3e355d8a94a13b694032c0b1a1f52c7965571f |
Compiler: gcc (Debian 10.2.1-6) 10.2.1 20210110
x86_64, portable variant
| artefact | max GLIBC_ |
SONAME | entry points | sha256 |
|---|---|---|---|---|
cross-libc-dlopen.so |
2.16 | n/a | 2 | 9df56656b5f064cf77d3e23ecefd1003d919fa75f356ce1781fd95d8121d72f7 |
gl-fwd.so |
2.14 | libGL.so.1 |
3470 | d99dd0d9f768dc40b1dbe54e9aa0ee5ae651af39944867d4add47b9401713550 |
egl-fwd.so |
2.14 | libEGL.so.1 |
44 | feff6e922f482411fbb2cf46b798b4e78c83bdeeacce5ddf0dfab209db303a6f |
gles-fwd.so |
2.14 | libGLESv2.so.2 |
358 | 2f7bd2851a23b2371af878d5f0dbbe251ebb2cbc9f23a16b6a925a4e58ee0636 |
runtime-select |
2.14 | n/a | 0 | 464e2892bef789b03aaa4b70b18ebeffbc5a7e695f0ce5360f48b430b0bf6430 |
Compiler: gcc (Debian 10.2.1-6) 10.2.1 20210110
Assets
Each artefact ships three ways: loose, in the .tar, and in the .zip.
⛔ No archive contains a directory, so an extract drops the files where
you are standing.
⭐ Two variants. The default reads CROSS_LIBC_DLOPEN_ROOT and also
APPDIR, which an AppImage runtime exports on its own, and is built
with -fcf-protection=full. The portable assets read
CROSS_LIBC_DLOPEN_ROOT and nothing else, and are built without that
flag. Take those if you want one spelling and no CET instrumentation.
⚠ The flag accounts for six of the shims 3478 endbr64; the rest are the trampolines, spelled as literal bytes, and no flag removes them.
All five objects differ between the two variants, so the variant ships
as archives rather than loose files.
| asset | sha256 |
|---|---|
aarch64-cross-libc-dlopen.so |
4b6864a26bb89a57f572c73bf7b0454b68dbb67c99ea8f5f86655d0928a10f72 |
aarch64-egl-fwd.so |
2d31c0502e2a96cc79aaa8970e09958455a1cbdc265717bee8db5aaf01c8aa8c |
aarch64-gl-fwd.so |
cc962c1012ae5a97914d814ec72abcda89dddf390f14c406c3e8853e444a4839 |
aarch64-gles-fwd.so |
322697c29696c9af0021beb8c7114624d31cb696955b8756f3918092d2b5e287 |
aarch64-runtime-select |
f1e64f85adca673c7bfec0429b65f2fe0800931f98118f36c68f53fdeb0ec1dc |
cross-libc-dlopen-aarch64.tar |
005bd03a4d6486afd69926632fc2510e8cb108d003b164961ac26af83be196f3 |
cross-libc-dlopen-aarch64.zip |
7bfcbfe00c321c48181b8dbcc9196af4681ae9691e0673701eb60d1871819d67 |
cross-libc-dlopen-portable-aarch64.tar |
70cff7fd2ae694eff0b3d1522cd7fa58e05f5cc5843b41748799ac25e053032c |
cross-libc-dlopen-portable-aarch64.zip |
4d4ed83beedf2abbbbb8ff217ca00c9e5dfc87208ee4846d81ef481f30020589 |
cross-libc-dlopen-portable-x86_64.tar |
4026b72539df37ae1032779ea0b6955e726aa6f3b10269794e733de1f0b7289d |
cross-libc-dlopen-portable-x86_64.zip |
8559cd6a5afc582edc65631e3c34d0f275352903e4684d3fcf88f216b3aa454c |
cross-libc-dlopen-x86_64.tar |
cfa6a263a43845ee022c26239a7e55abbe1f9e26f028de66a485b518fadbd603 |
cross-libc-dlopen-x86_64.zip |
803053778b5319d15a4aa363d0f3dfc2ce89dd6c3054727bca3e8069c9bfcb44 |
x86_64-cross-libc-dlopen.so |
2761cbf0715e099429803dd04b236851fd2d71fade039949edf344a00e93c410 |
x86_64-egl-fwd.so |
3b9bf82d04c98adbe36a96c9ecf8cb621384eb1ab5cf46fc20196623ce963e4f |
x86_64-gl-fwd.so |
b4f3f3311833dc23149ce740fdd2b9c052b72d7711c0b1cec7514a64d4ddb01f |
x86_64-gles-fwd.so |
c502d8d344edac7549e6c9afc1de16fd411db38bf69eb880db283de2d792e04c |
x86_64-runtime-select |
31eb619d0a8c73e3e212157d5d3e355d8a94a13b694032c0b1a1f52c7965571f |
⚠ The artefact rows above come from the manifest. The archive rows are
computed here, because the archives did not exist when it was written.
Using it
LD_PRELOAD=/path/to/cross-libc-dlopen.so CROSS_LIBC_DLOPEN=1 ./your-program
For a bundle, put the objects in its lib/ and name them in .preload.
The switches are in the README and
docs/integrating.md
has the detail per target.