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


Reply via email to