stdlib_libraries/fiddle_handles.rb

tests/_examples/stdlib_libraries/fiddle_handles.rb in the metorex repository.

# Fiddle::Handle opens a shared library, or the program itself, and answers
# the address each symbol in it is loaded at.
require "fiddle"

begin
  Fiddle::Handle.new("doesnotexist.doesnotexist")
rescue Fiddle::DLError => error
  p(error.class.ancestors.take(3))
end

program = Fiddle::Handle.new(nil)
strlen = program.sym("strlen")
p([strlen.is_a?(Integer), strlen > 0, program["strlen"] == strlen])
p(Fiddle::Handle::DEFAULT.sym("strlen") == Fiddle::Handle.sym("strlen"))

begin
  program.sym("no_such_symbol_here")
rescue Fiddle::DLError => error
  p(error.message)
end

p(program.close)
begin
  program.close
rescue Fiddle::DLError => error
  p(error.message)
end
begin
  program.sym("strlen")
rescue Fiddle::DLError => error
  p(error.message)
end

Output:

[Fiddle::DLError, Fiddle::Error, StandardError]
[true, true, true]
true
"unknown symbol \"no_such_symbol_here\""
0
"dlclose() called too many times"
"closed handle"