Модуль: ELFShim Приватный
- Расширен модулем:
- T::Helpers
- Определён в:
- os/linux/elf.rb,
extend/pathname.rb
Обзор
Этот модуль является частью приватного API. Этот модуль можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого модуля, поскольку он может быть удалён или изменён без предупреждения.
Расширение Pathname для работы с файлами ELF.
Сводка методов экземпляра свернуть
- #arch ⇒ Symbol приватный
- #arch_compatible?(wanted_arch) ⇒ Boolean приватный
- #binary_executable? ⇒ Boolean приватный
- #dylib? ⇒ Boolean приватный
- #dylib_id ⇒ String? приватный
- #dynamic_elf? ⇒ Boolean приватный
- #dynamically_linked_libraries(except: :none, resolve_variable_references: true) ⇒ Array<String> приватный
- #elf? ⇒ Boolean приватный
- #elf_type ⇒ Symbol приватный
- #initialize(path) ⇒ void приватный
- #interpreter ⇒ String? приватный
- #patch!(interpreter: nil, rpath: nil) ⇒ void приватный
- #patchelf_patcher ⇒ ::PatchELF::Patcher приватный
Не кэшируйте исправитель: пока он существует, файл ELF остаётся открытым.
- #read_uint16(offset) ⇒ Integer приватный
- #read_uint8(offset) ⇒ Integer приватный
- #rpath ⇒ String? приватный
Путь поиска во время выполнения, например: "/lib:/usr/lib:/usr/local/lib".
- #rpaths ⇒ Array<String> приватный
Массив записей путей поиска во время выполнения, например: ["/lib", "/usr/lib", "/usr/local/lib"].
- #save_using_patchelf_rb(new_interpreter, new_rpath) ⇒ void приватный
- #section_names ⇒ Array<String> приватный
Подробное описание методов экземпляра
#arch ⇒ Symbol
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
82 83 84 85 86 87 88 89 90 91 92 93 94 | # File 'os/linux/elf.rb', line 82 def arch return :dunno unless elf? @arch ||= case read_uint16(ARCHITECTURE_OFFSET) when ARCHITECTURE_I386 then :i386 when ARCHITECTURE_X86_64 then :x86_64 when ARCHITECTURE_POWERPC then :ppc32 when ARCHITECTURE_POWERPC64 then :ppc64 when ARCHITECTURE_ARM then :arm when ARCHITECTURE_AARCH64 then :arm64 else :dunno end end |
#arch_compatible?(wanted_arch) ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
97 98 99 100 101 102 103 104 | # File 'os/linux/elf.rb', line 97 def arch_compatible?(wanted_arch) return true unless elf? # Treat ppc64le and ppc64 the same wanted_arch = :ppc64 if wanted_arch == :ppc64le wanted_arch == arch end |
#binary_executable? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
123 124 125 | # File 'os/linux/elf.rb', line 123 def binary_executable? elf_type == :executable end |
#dylib? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
118 119 120 | # File 'os/linux/elf.rb', line 118 def dylib? elf_type == :dylib end |
#dylib_id ⇒ String?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
294 295 296 | # File 'os/linux/elf.rb', line 294 def dylib_id .dylib_id end |
#dynamic_elf? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
154 155 156 | # File 'os/linux/elf.rb', line 154 def dynamic_elf? .dynamic_elf? end |
#dynamically_linked_libraries(except: :none, resolve_variable_references: true) ⇒ Array<String>
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
299 300 301 | # File 'os/linux/elf.rb', line 299 def dynamically_linked_libraries(except: :none, resolve_variable_references: true) .dylibs end |
#elf? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
71 72 73 74 75 76 77 78 79 | # File 'os/linux/elf.rb', line 71 def elf? return @elf unless @elf.nil? return @elf = false if read(MAGIC_NUMBER_ASCII.size, MAGIC_NUMBER_OFFSET) != MAGIC_NUMBER_ASCII # Check that this ELF file is for Linux or System V. # OS_ABI is often set to 0 (System V), regardless of the target platform. @elf = [OS_ABI_LINUX, OS_ABI_SYSTEM_V].include? read_uint8(OS_ABI_OFFSET) end |
#elf_type ⇒ Symbol
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
107 108 109 110 111 112 113 114 115 | # File 'os/linux/elf.rb', line 107 def elf_type return :dunno unless elf? @elf_type ||= case read_uint16(TYPE_OFFSET) when TYPE_EXECUTABLE then :executable when TYPE_SHARED then :dylib else :dunno end end |
#initialize(path) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
48 49 50 51 52 53 54 55 56 57 58 | # File 'os/linux/elf.rb', line 48 def initialize(path) @elf = T.let(nil, T.nilable(T::Boolean)) @arch = T.let(nil, T.nilable(Symbol)) @elf_type = T.let(nil, T.nilable(Symbol)) @rpath = T.let(nil, T.nilable(String)) @interpreter = T.let(nil, T.nilable(String)) @dynamic_elf = T.let(nil, T.nilable(T::Boolean)) @metadata = T.let(nil, T.nilable(Metadata)) super end |
#interpreter ⇒ String?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
142 143 144 | # File 'os/linux/elf.rb', line 142 def interpreter .interpreter end |
#patch!(interpreter: nil, rpath: nil) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Этот метод не возвращает определённого значения.
147 148 149 150 151 | # File 'os/linux/elf.rb', line 147 def patch!(interpreter: nil, rpath: nil) return if interpreter.blank? && rpath.blank? save_using_patchelf_rb interpreter, rpath end |
#patchelf_patcher ⇒ ::PatchELF::Patcher
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Не кэшируйте объект patcher: пока он существует, ELF-файл остаётся открытым. Для доступа только на чтение к метаданным ELF-файла получите их и кэшируйте с помощью Metadata.
282 283 284 285 | # File 'os/linux/elf.rb', line 282 def patchelf_patcher require "patchelf" ::PatchELF::Patcher.new to_s, on_error: :silent end |
#read_uint16(offset) ⇒ Integer
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
66 67 68 | # File 'os/linux/elf.rb', line 66 def read_uint16(offset) read(2, offset).unpack1("v") end |
#read_uint8(offset) ⇒ Integer
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
61 62 63 | # File 'os/linux/elf.rb', line 61 def read_uint8(offset) read(1, offset).unpack1("C") end |
#rpath ⇒ String?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Путь поиска во время выполнения, например: "/lib:/usr/lib:/usr/local/lib"
130 131 132 | # File 'os/linux/elf.rb', line 130 def rpath .rpath end |
#rpaths ⇒ Array<String>
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Массив записей пути поиска во время выполнения, например: ["/lib", "/usr/lib", "/usr/local/lib"]
137 138 139 | # File 'os/linux/elf.rb', line 137 def rpaths Array(rpath&.split(":")) end |
#save_using_patchelf_rb(new_interpreter, new_rpath) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Этот метод возвращает неопределённое значение.
271 272 273 274 275 276 | # File 'os/linux/elf.rb', line 271 def save_using_patchelf_rb(new_interpreter, new_rpath) patcher = patchelf_patcher patcher.interpreter = new_interpreter if new_interpreter.present? patcher.rpath = new_rpath if new_rpath.present? patcher.save(patchelf_compatible: true) end |
#section_names ⇒ Array<String>
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
159 160 161 | # File 'os/linux/elf.rb', line 159 def section_names .section_names end |
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/ELFShim.html