ruby / fiddle

A libffi wrapper for Ruby.
BSD 2-Clause "Simplified" License
154 stars 37 forks source link

Can't open linker script files #107

Closed nevans closed 2 years ago

nevans commented 2 years ago

On my Ubuntu 21.10 installation, several shared libraries .so files are installed as linker scripts instead of using a symlink. In my research, I see that this is done (or has been done) in Debian, CentOS, Fedora, RHEL, Gentoo, and maybe Arch (I didn't personally verify the last two). This shouldn't a big deal if you link with GNU ld, but it breaks dlopen.

I found workarounds in the ffi gem and in ghc, and perhaps one of those could be copied into fiddle.

A workaround for users of fiddle might be to attempt to load a specific version of the library:

irb(main):005:0> File.read "/lib/x86_64-linux-gnu/libncurses.so"
=> "INPUT(libncurses.so.6 -ltinfo)\n"
irb(main):006:0> Fiddle::Handle.new("libncurses.so")
(irb):6:in `initialize': /lib/x86_64-linux-gnu/libncurses.so: file too short (Fiddle::DLError)
    from (irb):6:in `new'                              
    from (irb):6:in `<main>'                           
    from /home/nick/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>'
    from /home/nick/.rbenv/versions/3.1.1/bin/irb:25:in `load'
    from /home/nick/.rbenv/versions/3.1.1/bin/irb:25:in `<main>'
irb(main):007:0> Fiddle::Handle.new("libncurses.so.6")
=> #<Fiddle::Handle:0x00007fcfbb858670>
chrisseaton commented 2 years ago

Hi what are you struggling to open?

nevans commented 2 years ago

I'm so sorry, I accidentally hit enter when I'd only just started creating the ticket! I was hoping I'd be able to fill in the details before anyone noticed. Anyway, I've updated the subject and I'll send a few other details over in a minute.

kou commented 2 years ago

Thanks for your report. I didn't know about linker script.

I've added support for linker script only on Linux for now.

nevans commented 2 years ago

Excellent, thanks!