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?
>> 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.