diff options
author | Sutou Kouhei <kou@clear-code.com> | 2022-04-11 08:32:05 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-10-18 17:21:45 +0900 |
commit | e84ea4af695de307c4e66bf0d9aa445a1016a4af (patch) | |
tree | ebf9174f58a297859630b3ecab55d4a4bbd2b19a /ext/fiddle | |
parent | 93da67d46394007aa977c9345535c37878fd0db9 (diff) | |
download | ruby-e84ea4af695de307c4e66bf0d9aa445a1016a4af.tar.gz |
[ruby/fiddle] Add support for linker script on Linux
GitHub: fix https://github.com/ruby/fiddle/pull/107
Reported by nicholas a. evans. Thanks!!!
https://github.com/ruby/fiddle/commit/49ea1490df
Diffstat (limited to 'ext/fiddle')
-rw-r--r-- | ext/fiddle/lib/fiddle.rb | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/ext/fiddle/lib/fiddle.rb b/ext/fiddle/lib/fiddle.rb index 09262c43ff..6137c487c6 100644 --- a/ext/fiddle/lib/fiddle.rb +++ b/ext/fiddle/lib/fiddle.rb @@ -58,7 +58,36 @@ module Fiddle # # See Fiddle::Handle.new for more. def dlopen library - Fiddle::Handle.new library + begin + Fiddle::Handle.new(library) + rescue DLError => error + case RUBY_PLATFORM + when /linux/ + case error.message + when /\A(\/.+?): (?:invalid ELF header|file too short)/ + # This may be a linker script: + # https://sourceware.org/binutils/docs/ld.html#Scripts + path = $1 + else + raise + end + else + raise + end + + File.open(path) do |input| + input.each_line do |line| + case line + when /\A\s*(?:INPUT|GROUP)\s*\(\s*([^\s,\)]+)/ + # TODO: Should we support multiple files? + return dlopen($1) + end + end + end + + # Not found + raise + end end module_function :dlopen |