On 7/8/2026 7:52 PM, Ziyang Zhang wrote: > On Wed, 8 Jul 2026 18:29:59 -0700, Pierrick Bouvier wrote: >> On 7/8/2026 5:27 PM, Ziyang Zhang wrote: >>> Hi Pierrick, >>> >>> On Wed, 8 Jul 2026 16:55:19 -0700, Pierrick Bouvier wrote: >>>>> +A minimal end-to-end example wraps a one-function library, >>>>> ``libhello.so``, >>>>> +declared by ``hello.h``: >>>>> + >>>>> +.. code-block:: c >>>>> + >>>>> + void hello(const char *name, int lucky); >>>>> + >>>> >>>> Please include full files for example: >>>> hello.h, hello.c and main.c calling hello function. >>>> >>>> Also, please include compiler commands for libhello.so and main. >>>> You can give a full example assuming it run on a x86_64 host. >>> Good idea. I will get it done in v8. >>> >>>> I could not get it to work. >>>> Following all the steps, the error message is: >>>> >>>> [GRT] failed to load host runtime >>>> qemu: uncaught target signal 6 (Aborted) - core dumped >>>> Aborted >>> On the error. [GRT] failed to load host runtime is the host side (QEMU) >>> failing to dlopen the Lorelei host runtime, which means $DEVKIT/lib was >>> not on the host LD_LIBRARY_PATH, for example if $DEVKIT was not set in >>> the shell that ran the command. -L only points QEMU at the guest's >>> loader and libc, so it is unrelated. >>> >>> I reproduced it: dropping just $DEVKIT/lib from the host LD_LIBRARY_PATH >>> gives exactly that message and the abort. The real fix is making the >>> example self-contained so nothing stays implicit, which is what v8 does. >>> >> >> I paid attention to follow steps correctly, but maybe I missed >> something. Please see here a full dump of my env and commands: >> >> $ git status >> Untracked files: >> (use "git add <file>..." to include in what will be committed) >> a.out >> hello.c >> hello.h >> libhello.so >> lorelei-devkit-x86_64-1.0.4.0.tar.xz >> lorelei-devkit-x86_64/ >> main.c >> thunks/ >> >> nothing added to commit but untracked files present (use "git add" to >> track) >> $ ldd a.out >> linux-vdso.so.1 (0x00007f5855c3a000) >> libhello.so => not found >> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 >> (0x00007f5855a0a000) >> /lib64/ld-linux-x86-64.so.2 (0x00007f5855c3c000) >> $ LD_LIBRARY_PATH=./ ldd a.out >> linux-vdso.so.1 (0x00007fef23831000) >> libhello.so => ./libhello.so (0x00007fef2381f000) >> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 >> (0x00007fef235fc000) >> /lib64/ld-linux-x86-64.so.2 (0x00007fef23833000) >> $ env | grep DEVKIT >> DEVKIT=/home/user/.work/qemu/lorelei-devkit-x86_64 >> $ tree thunks/ >> thunks/ >> ├── lib >> │ └── x86_64-LoreHTL >> │ └── libhello_HTL.so >> └── x86_64 >> └── lib >> └── x86_64-LoreGTL >> └── libhello.so >> >> 6 directories, 2 files >> $ LORELEI_THUNK_PATH=thunks LD_LIBRARY_PATH=$DEVKIT/lib:. \ >> build/qemu-x86_64 -plugin build/contrib/plugins/libdlcall.so \ >> -L $DEVKIT/x86_64/sysroot \ >> -E LD_LIBRARY_PATH=$DEVKIT/x86_64/lib:thunks/x86_64/lib/x86_64-LoreGTL\ >> ./a.out >> [GRT] failed to load host runtime >> qemu: uncaught target signal 6 (Aborted) - core dumped >> Aborted >> >> Any idea what could be missing? > > The "[GRT] failed to load host runtime" message is the host side failing > to dlopen libLoreHostRT.so, and until now it did not print why. The next > Lorelei devkit (1.0.5.0) fixes that: the same failure now reads > > [GRT] failed to load host runtime: <the exact dlerror> > > so upgrading the devkit will usually tell you the cause directly, with > nothing extra to run. > > Set LD_DEBUG for the QEMU process, and unset it for the guest with -U so > the guest loader does not also flood the output: > > LD_DEBUG=libs LORELEI_THUNK_PATH=thunks \ > LD_LIBRARY_PATH=$DEVKIT/lib:. \ > build/qemu-x86_64 -U LD_DEBUG -plugin build/contrib/plugins/ > libdlcall.so \ > -L $DEVKIT/x86_64/sysroot \ > -E LD_LIBRARY_PATH=$DEVKIT/x86_64/lib:thunks/x86_64/lib/x86_64- > LoreGTL \ > ./a.out 2>ld.txt > Then look in ld.txt for the block that starts with find > library=libLoreHostRT.so [0]; searching. > > A healthy load tries $DEVKIT/lib first, finds it there, and ends in a > matching "calling init" line. A failing load has no trying > file=$DEVKIT/lib/libLoreHostRT.so line at all. > > So the difference is a single line. If $DEVKIT/lib is never tried, then > it did not reach the host LD_LIBRARY_PATH of the QEMU process for that > command. If instead that line is present but the load still fails, the > message after it (a missing dependency, an ABI mismatch) is the real > reason, and that is what 1.0.5.0 would print. >
Thanks, I'll try from v9 and latest release. >>>> We talked about not overriding sysroot, so please remove -L part. >>>> Also, Why do current dir is passed in LD_LIBRARY_PATH? >>> In this example it assumes that the host libhello.so is in the current >>> directory, which must be able to be found in LD_LIBRARY_PATH. >>> >>>>> +The guest ``LD_LIBRARY_PATH``, passed with ``-E``, controls what the >>>>> emulated >>>>> +program loads: >>>>> + >>>>> +* ``$DEVKIT/x86_64/lib`` contains the guest runtime support shipped >>>>> with the >>>>> + devkit. >>>>> +* ``thunks/x86_64/lib/x86_64-LoreGTL`` contains the generated guest >>>>> + ``libhello.so`` thunk, used in place of an ordinary guest library. >>>>> + >>>>> +The host ``LD_LIBRARY_PATH`` controls what the plugin and host thunk >>>>> load: >>>>> + >>>>> +* ``$DEVKIT/lib`` contains the host runtime support shipped with the >>>>> devkit. >>>>> +* ``.`` is the current directory, where the host's own >>>>> ``libhello.so`` is >>>>> + located. >>>>> + >>>>> +See the runnable >>>>> +`hello <https://github.com/rover2024/lorelei/tree/main/examples/ >>>>> hello>`_ >>>>> +(minimal) and >>>>> +`demo <https://github.com/rover2024/lorelei/tree/main/examples/ >>>>> demo>`_ >>>>> +(variadic functions and a callback that reenters the guest) >>>>> examples, and >>>>> +`Lorelei <https://github.com/rover2024/lorelei>`_ for prebuilt thunk >>>>> trees and >>>>> +the runtime environment they expect. >>>>> + >>>>> +.. list-table:: Dynamic Linking Call arguments >>>>> + :widths: 20 80 >>>>> + :header-rows: 1 >>>>> + >>>>> + * - Option >>>>> + - Description >>>>> + * - syscall_num=N >>>>> + - The magic syscall number the guest issues (default 4096). Must >>>>> be high >>>>> + enough not to clash with a real syscall. >>>>> + >>>>> Other emulation features >>>>> ------------------------ >>>>> >>>> >>>> Regards, >>>> Pierrick >>> >>> It looks unexplained today only because the walkthrough never shows >>> building it. v8 will. >>> >>> v8 will also include the full hello.h, hello.c and main.c, plus the cc >>> and clang commands for libhello.so and main, as one runnable x86_64 >>> sequence. >
