riscv64 libgccjit stopped working

Bug #2011487 reported by Sergio Durigan Junior
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
emacs (Ubuntu)
Fix Released
Undecided
Unassigned
gcc-12 (Ubuntu)
Fix Released
High
Unassigned

Bug Description

Hi,

This bug is affecting Emacs, as can be seen here:

https://launchpad.net/ubuntu/+source/emacs/1:28.2+1-12ubuntu1/+build/25649207

I was able to track this down to a problem with libgccjit and LIBRARY_PATH on riscv64. Basically, compiling the example program from https://gcc.gnu.org/onlinedocs/jit/intro/tutorial01.html and running it leads to:

$ gcc /tmp/1.c -lgccjit
$ ./a.out
ld: cannot find crtbeginS.o: No such file or directory
libgccjit.so: error: error invoking gcc driver
NULL result

If we explicitly specify LIBRARY_PATH, it works:

$ LIBRARY_PATH=/usr/lib/gcc/ ./a.out
hello world

tags: added: update-excuse
Revision history for this message
Matthias Klose (doko) wrote :

please run strace --trace=file ./a.out

Changed in gcc-12 (Ubuntu):
status: New → Incomplete
Revision history for this message
Sergio Durigan Junior (sergiodj) wrote :

Hm, here's the interesting part from the strace output:

faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/13riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/13riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/13crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/../../riscv64-linux-gnu/lib/riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/../../riscv64-linux-gnu/lib/riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/gcc/riscv64-linux-gnu/../../riscv64-linux-gnu/lib/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib64/lp64d/riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib64/lp64d/riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib64/lp64d/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib64/lp64d/riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib64/lp64d/riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib64/lp64d/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib/riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib/riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/riscv64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/riscv64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/usr/lib/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)

For some reason, it's trying to load crtbeginS.so from gcc-13, even though I compiled the program using gcc-12 and don't even have libgccjit-13-dev installed. I wonder why this doesn't happen in other architectures, though. I will double check.

Revision history for this message
Sergio Durigan Junior (sergiodj) wrote :

Interestingly, this is the strace output for amd64:

access("/usr/lib/gcc/x86_64-linux-gnu/13x86_64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/13x86_64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/13crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/../../x86_64-linux-gnu/lib/x86_64-linux-gnu/13/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/../../x86_64-linux-gnu/lib/x86_64-linux-gnu/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/../../x86_64-linux-gnu/lib/../lib/crtbeginS.o", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/../x86_64-linux-gnu/13/crtbeginS.o", R_OK) = 0

Again, libgccjit-13-dev is not installed. So it seems that it's expected (although IMHO wrong) for a program compiled with gcc-12 to load .o files from libgcc-13-dev. But that's another issue.

The real problem here seems to be the fact that we see an attempt to load "/usr/lib/gcc/x86_64-linux-gnu/../x86_64-linux-gnu/13/crtbeginS.o" on amd64, which is successful; but we don't see an attempt to load "/usr/lib/gcc/riscv64-linux-gnu/../riscv64-linux-gnu/13/crtbeginS.o" on riscv64.

Changed in gcc-12 (Ubuntu):
status: Incomplete → New
Revision history for this message
Sergio Durigan Junior (sergiodj) wrote :

I ran the test on Mantic using both gcc-12 and gcc-13, and I can't reproduce this anymore. Marking the bug as Fix Released.

Changed in emacs (Ubuntu):
status: New → Fix Released
Changed in gcc-12 (Ubuntu):
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.