adrianmcmenamin
adrianmcmenamin

Reputation: 1129

Missing library on 64 bit riscv Fedora

I am working on an assembly-based Forth (on top of Linux - https://github.com/mcmenaminadrian/riscyforth) for Risc-V and I can build it and run it on my real 64 bit hardware (a Nezha SBC running a Debian-based install).

I decided to test it also on QEMU with Fedora but it won't run:

[root@fedora-riscv riscyforth]# ./riscyforth 
-bash: ./riscyforth: No such file or directory

This seems to be because I am missing a library:

readelf -a ./riscyforth 

....


   Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000010040 0x0000000000010040
                 0x0000000000000150 0x0000000000000150  R      0x8
  INTERP         0x0000000000000190 0x0000000000010190 0x0000000000010190
                 0x000000000000000d 0x000000000000000d  R      0x1
      [Requesting program interpreter: /lib/ld.so.1]

And my understanding this is a 32 bit library - but my OS is 64 bit:

[root@fedora-riscv riscyforth]# uname -a
Linux fedora-riscv 5.10.6-200.0.riscv64.fc33.riscv64 #1 SMP Tue Jan 12 13:46:56 UTC 2021 
riscv64 riscv64 riscv64 GNU/Linux

And, rather more importantly, so is the ELF:

[root@fedora-riscv riscyforth]# readelf -a ./riscyforth | more
ELF Header:
   Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
   Class:                             ELF64
   Data:                              2's complement, little endian
   Version:                           1 (current)
   OS/ABI:                            UNIX - System V
   ABI Version:                       0
   Type:                              EXEC (Executable file)
   Machine:                           RISC-V
   Version:                           0x1
   Entry point address:               0x10690
   Start of program headers:          64 (bytes into file)
   Start of section headers:          98992 (bytes into file)
   Flags:                             0x5, RVC, double-float ABI
   Size of this header:               64 (bytes)
   Size of program headers:           56 (bytes)
   Number of program headers:         6
   Size of section headers:           64 (bytes)
   Number of section headers:         23
   Section header string table index: 22

I have updated the Fedora install and rebooted (as there was a mix of -33 and -32 packages before) but this has not fixed the issue.

Why do I need to install a 32 library and which one do I need to install? I cannot find an obviously titled RPM.

Or do I need to put something in the Makefile for Fedora that I don't need on the Debian system?

Upvotes: 0

Views: 1939

Answers (1)

Employed Russian
Employed Russian

Reputation: 213375

This seems to be because I am missing a library:

You are not missing a library, you are missing the ELF interpreter (/lib/ld.so.1), also known as the dynamic linker or the loader.

And my understanding this is a 32 bit library

I am not sure what "this" in your statement refers to; your binary is definitely 64-bit, and couldn't use any 32-bit libraries in any case.

Why do I need to install a 32 library

You don't.

It appears that normally /lib/ld.so.1 should be present on a RISC-V system and be a symlink to /lib/ld-linux-riscv64-lp64d.so.1 (at least on GLIBC-based systems).

So your QEMU target environment is missing required parts.

I fixed the immediate problem with ln -s /lib/ld-linux-riscv64-lp64d.so.1 /lib/ld.so.1 but I still hope someone can answer why I needed this.

Because you somehow didn't install GLIBC into your QEMU environment properly.

Upvotes: 1

Related Questions