I recently needed to generate an ELF
binary with both RPATH
and RUNPATH
entries. I could not figure out how to produce this using linker command line arguments.
I was considering attempting a linker script, but first I switched to my Lisp
REPL
buffer 1 and found that (ql:quickload "elf")
loaded a promising-looking Common Lisp ELF
library.
I created a stub library with RPATH
using gcc
and an empty C
file, then loaded it with (elf:read-elf)
.
With the SLIME
inspector (M-x slime-inspect
) I could traverse the structure of the ELF
headers. I eventually found the RPATH
entry.
In the REPL
I built up a function to search for RPATH
then push
a new RUNPATH
entry alongside it.
It turned out the ELF
library had no support for the RUNPATH
entry, so I redefined its dyn-tag
dictionary to include it.
After adding RUNPATH
, I wrote the modified ELF
structures to a file using (elf:write-elf)
. The generated ELF
file sufficed for the test case.
I thought this was an interesting use case to share, demonstrating unique properties of the Lisp
environment. I published the result (I realize now I should have written generate-example-library.sh
in Lisp
instead of shell!; oh well).
- Which I have been trying to keep open lately, inspired by this post.