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