ruby-elf 1.0.6.1 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/DONATING +1 -1
- data/bin/cowstats +1 -1
- data/bin/elfgrep +55 -16
- data/bin/missingstatic +1 -1
- data/bin/rbelf-nm +46 -11
- data/bin/rbelf-read +4 -6
- data/bin/rbelf-size +4 -2
- data/bin/verify-lfs +1 -1
- data/extras/bindings-parsers.rb +1 -1
- data/lib/bytestream-reader.rb +1 -1
- data/lib/elf.rb +2 -2
- data/lib/elf/dynamic.rb +2 -2
- data/lib/elf/file.rb +10 -1
- data/lib/elf/gnu.rb +1 -1
- data/lib/elf/section.rb +1 -1
- data/lib/elf/stringtable.rb +4 -14
- data/lib/elf/sunw.rb +1 -1
- data/lib/elf/symbol.rb +43 -37
- data/lib/elf/symboltable.rb +1 -1
- data/lib/elf/tools.rb +3 -2
- data/lib/elf/utils/loader.rb +1 -1
- data/lib/elf/utils/offsettable.rb +49 -0
- data/lib/elf/utils/pool.rb +1 -1
- data/lib/elf/value.rb +1 -1
- data/manpages/cowstats.1 +2 -2
- data/manpages/cowstats.1.xml +1 -1
- data/manpages/elfgrep.1 +39 -5
- data/manpages/elfgrep.1.xml +53 -2
- data/manpages/missingstatic.1 +2 -2
- data/manpages/missingstatic.1.xml +1 -1
- data/manpages/rbelf-nm.1 +18 -3
- data/manpages/rbelf-nm.1.xml +41 -1
- data/manpages/rbelf-size.1 +2 -2
- data/manpages/rbelf-size.1.xml +1 -1
- data/manpages/verify-lfs.1 +2 -2
- data/manpages/verify-lfs.1.xml +1 -1
- data/tools/assess_duplicate_save.rb +1 -1
- data/tools/link-collisions/harvest.rb +19 -9
- data/tools/link-collisions/known-broken +7 -18
- data/tools/link-collisions/multimplementations +35 -4
- data/tools/link-collisions/suppress.rb +1 -1
- data/tools/link-collisions/suppressions +22 -18
- data/tools/rbelf-lddtree.rb +1 -1
- metadata +13 -16
- data/lib/elf/symbol/demangler_gcc3.rb +0 -1952
data/DONATING
CHANGED
@@ -38,5 +38,5 @@ willing to donate.
|
|
38
38
|
|
39
39
|
If you know other foundations, donations to which could be deduced
|
40
40
|
from taxes in other countries, feel free to suggest more by mailing me
|
41
|
-
at flameeyes@
|
41
|
+
at flameeyes@flameeyes.eu . Hopefully wherever the research is based, the
|
42
42
|
improvements will come equally.
|
data/bin/cowstats
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2008-2010 Diego
|
3
|
+
# Copyright © 2008-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
data/bin/elfgrep
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2011 Diego
|
3
|
+
# Copyright © 2011 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -52,6 +52,10 @@ module Elf::Tools
|
|
52
52
|
["--ignore-case", "-i", GetoptLong::NO_ARGUMENT],
|
53
53
|
# Use NULLs to terminate filenames
|
54
54
|
["--null", "-Z", GetoptLong::NO_ARGUMENT],
|
55
|
+
# read the list of patterns from the given file
|
56
|
+
["--file", "-f", GetoptLong::REQUIRED_ARGUMENT],
|
57
|
+
# match the whole symbol
|
58
|
+
["--symbol-regexp", "-s", GetoptLong::NO_ARGUMENT],
|
55
59
|
]
|
56
60
|
|
57
61
|
@invert_match = false
|
@@ -60,6 +64,7 @@ module Elf::Tools
|
|
60
64
|
@match_symbols = nil
|
61
65
|
|
62
66
|
@patterns = []
|
67
|
+
@pattern_is_first = true
|
63
68
|
end
|
64
69
|
|
65
70
|
# We define callbacks for some behaviour-changing options as those
|
@@ -104,9 +109,19 @@ module Elf::Tools
|
|
104
109
|
end
|
105
110
|
|
106
111
|
def self.regexp_cb(pattern)
|
112
|
+
@pattern_is_first = false
|
113
|
+
|
107
114
|
@patterns << pattern
|
108
115
|
end
|
109
116
|
|
117
|
+
def self.file_cb(filename)
|
118
|
+
@pattern_is_first = false
|
119
|
+
|
120
|
+
@patterns += File.readlines(filename).
|
121
|
+
each { |l| l.strip! }.
|
122
|
+
reject { |l| l.empty? }
|
123
|
+
end
|
124
|
+
|
110
125
|
def self.after_options
|
111
126
|
if @no_match_undefined and @no_match_defined
|
112
127
|
puterror "you need to match at least defined or undefined symbols"
|
@@ -122,7 +137,7 @@ module Elf::Tools
|
|
122
137
|
# to be given by stdin, and that won't include the actual pattern,
|
123
138
|
# if we have an @-prefixed argument, that's a list of targets and
|
124
139
|
# can't include the pattern either.
|
125
|
-
if (@
|
140
|
+
if (@pattern_is_first and
|
126
141
|
@targets.size >= 1 and
|
127
142
|
@targets[0] !~ /^@/)
|
128
143
|
|
@@ -139,15 +154,40 @@ module Elf::Tools
|
|
139
154
|
@file_list_fmt = "%s#{@null ? "\0" : "\n"}"
|
140
155
|
|
141
156
|
regexp_options = @ignore_case ? Regexp::IGNORECASE : 0
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
157
|
+
regexps = @patterns.collect { |pattern|
|
158
|
+
if @match == :fixed_strings
|
159
|
+
pattern.split(/\r?\n/).collect { |string|
|
160
|
+
Regexp.new(Regexp.escape(string), regexp_options)
|
161
|
+
}
|
162
|
+
else
|
163
|
+
Regexp.new(pattern, regexp_options)
|
164
|
+
end
|
165
|
+
}.flatten
|
166
|
+
|
167
|
+
if @symbol_regexp
|
168
|
+
# if we're matching a whole symbol name we need the longest
|
169
|
+
# match, and Ruby's union of regexp does _not_ enforce that,
|
170
|
+
# so we have to do it the long way.
|
171
|
+
|
172
|
+
@match_lambda = proc { |symbol|
|
173
|
+
longest_match = ""
|
174
|
+
|
175
|
+
regexps.each { |re|
|
176
|
+
m = re.match(symbol)
|
177
|
+
longest_match = m[0] unless (m.nil? or m[0].length < longest_match.length)
|
178
|
+
}
|
179
|
+
|
180
|
+
(longest_match != symbol) == @invert_match
|
181
|
+
}
|
182
|
+
else
|
183
|
+
# if we're just doing a loose match, unite the regexps and do
|
184
|
+
# it the fast way.
|
185
|
+
regexp = Regexp.union(regexps)
|
186
|
+
|
187
|
+
@match_lambda = proc { |symbol|
|
188
|
+
regexp.match(symbol).nil? == @invert_match
|
189
|
+
}
|
190
|
+
end
|
151
191
|
end
|
152
192
|
|
153
193
|
def self.analysis(file)
|
@@ -181,16 +221,15 @@ module Elf::Tools
|
|
181
221
|
symname = symbol.name
|
182
222
|
symname += "@#{symbol.version}" if @match_version
|
183
223
|
|
184
|
-
|
185
|
-
# or not; we use an invert match since we have to further compare
|
186
|
-
# that to @invert_match
|
187
|
-
if (@invert_match == (@regexp =~ symname).nil?)
|
224
|
+
if (@match_lambda.call(symname))
|
188
225
|
matches = matches+1
|
189
226
|
|
190
227
|
break unless @show == :full_match
|
191
228
|
next if @count
|
192
229
|
|
193
|
-
|
230
|
+
printf("%s%#{elf.address_print_size}s %s %s\n",
|
231
|
+
file_prefix, symbol.address_string,
|
232
|
+
(symbol.nm_code rescue '?'), symname)
|
194
233
|
end
|
195
234
|
end
|
196
235
|
|
data/bin/missingstatic
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2008-2010 Diego
|
3
|
+
# Copyright © 2008-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
data/bin/rbelf-nm
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
# Copyright © 2007-2010 Diego
|
3
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -28,23 +28,40 @@ module Elf::Tools
|
|
28
28
|
super
|
29
29
|
@options |= [
|
30
30
|
["--dynamic", "-D", GetoptLong::NO_ARGUMENT],
|
31
|
-
["--demangle", "-C", GetoptLong::NO_ARGUMENT]
|
31
|
+
["--demangle", "-C", GetoptLong::NO_ARGUMENT],
|
32
|
+
["--sort-by", "-S", GetoptLong::REQUIRED_ARGUMENT],
|
33
|
+
["--show-version", "-V", GetoptLong::NO_ARGUMENT],
|
32
34
|
]
|
33
35
|
|
34
36
|
@scan_section = '.symtab'
|
35
37
|
@demangle = false
|
36
38
|
@exitval = 0
|
39
|
+
@show_version = false
|
37
40
|
|
38
|
-
|
39
|
-
# output, and synchronise on it).
|
40
|
-
@execution_threads = nil
|
41
|
+
@sort = :name
|
41
42
|
end
|
42
43
|
|
43
44
|
def self.dynamic_cb
|
44
45
|
@scan_section = '.dynsym'
|
45
46
|
end
|
46
47
|
|
48
|
+
def self.sort_by_cb(attr)
|
49
|
+
case attr
|
50
|
+
when 'address'
|
51
|
+
@sort = :address
|
52
|
+
when 'name'
|
53
|
+
@sort = :name
|
54
|
+
when 'none'
|
55
|
+
@sort = nil
|
56
|
+
else
|
57
|
+
puterror "invalid sort attribute: #{attr}"
|
58
|
+
exit -1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
47
62
|
def self.analysis(file)
|
63
|
+
symbols = []
|
64
|
+
|
48
65
|
Elf::File.open(file) do |elf|
|
49
66
|
if not elf.has_section? @scan_section
|
50
67
|
puterror "No symbols"
|
@@ -55,19 +72,37 @@ module Elf::Tools
|
|
55
72
|
elf[@scan_section].each do |sym|
|
56
73
|
next if sym.name == ''
|
57
74
|
begin
|
58
|
-
|
75
|
+
code = sym.nm_code
|
59
76
|
rescue Elf::Symbol::UnknownNMCode => e
|
60
77
|
puterror(e.message)
|
61
|
-
|
78
|
+
code = "?"
|
62
79
|
end
|
63
80
|
|
64
|
-
version_name = sym.version
|
65
|
-
version_name = version_name ? "@#{sym.version_default? ? '@' : ''}#{version_name}" : ""
|
66
|
-
|
67
81
|
name = @demangle ? sym.demangle : sym.name
|
68
82
|
|
69
|
-
|
83
|
+
if @show_version and sym.version
|
84
|
+
name = sprintf("%s@%s%s",
|
85
|
+
name,
|
86
|
+
sym.version_default? ? '@' : '',
|
87
|
+
sym.version)
|
88
|
+
end
|
89
|
+
|
90
|
+
symbols << {
|
91
|
+
:address => sym.address_string,
|
92
|
+
:code => code,
|
93
|
+
:name => name
|
94
|
+
}
|
70
95
|
end
|
96
|
+
|
97
|
+
symbols.sort! { |x, y| x[@sort] <=> y[@sort] } unless @sort.nil?
|
98
|
+
|
99
|
+
format_sym = "%#{elf.address_print_size}s %s %s\n"
|
100
|
+
@output_mutex.synchronize {
|
101
|
+
symbols.each do |sym|
|
102
|
+
printf(format_sym,
|
103
|
+
sym[:address], sym[:code], sym[:name])
|
104
|
+
end
|
105
|
+
}
|
71
106
|
end
|
72
107
|
end
|
73
108
|
|
data/bin/rbelf-read
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2008-2011 Diego
|
3
|
+
# Copyright © 2008-2011 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -43,8 +43,6 @@ module Elf::Tools
|
|
43
43
|
def self.analysis(file)
|
44
44
|
elf = Elf::File.open(file)
|
45
45
|
|
46
|
-
@addrsize = (elf.elf_class == Elf::Class::Elf32 ? 8 : 16)
|
47
|
-
|
48
46
|
@output_mutex.synchronize {
|
49
47
|
printf("\nFile: %s\n", file) if @targets.size != 1
|
50
48
|
read_file_header(elf) if @file_header
|
@@ -57,12 +55,12 @@ module Elf::Tools
|
|
57
55
|
printf("There are %d section headers, starting at offset 0x%x:\n\nSection Headers:\n",
|
58
56
|
elf.sections, elf.shoff)
|
59
57
|
|
60
|
-
printf("[Nr] Name
|
58
|
+
printf("[Nr] Name Type Addr Off Size ES Flags Lk Inf Al\n")
|
61
59
|
|
62
60
|
elf.each_section do |section|
|
63
|
-
printf("[%2d] %s %s %0#{
|
61
|
+
printf("[%2d] %s %s %0#{elf.address_print_size}x %08x %08x %2d %s %2d %3d %2d\n",
|
64
62
|
section.index,
|
65
|
-
section.name.ljust(
|
63
|
+
section.name.ljust(23),
|
66
64
|
section.type.mnemonic.upcase.ljust(13),
|
67
65
|
section.addr, section.offset, section.size, section.entsize,
|
68
66
|
section.flags_s.ljust(5), section.link.to_i, section.info, section.addralign)
|
data/bin/rbelf-size
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2008-2011 Diego
|
3
|
+
# Copyright © 2008-2011 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -143,7 +143,9 @@ module Elf::Tools
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def self.count_allocated(results)
|
146
|
-
results[:allocated] = results.values.inject { |sum, val|
|
146
|
+
results[:allocated] = results.values.inject { |sum, val|
|
147
|
+
sum = val.is_a?(String) ? sum : (sum+val)
|
148
|
+
}
|
147
149
|
end
|
148
150
|
|
149
151
|
def self.apply_differential(results)
|
data/bin/verify-lfs
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
-
# Copyright © 2010 Diego
|
3
|
+
# Copyright © 2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
data/extras/bindings-parsers.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
# Copyright © 2006-2008, Diego
|
3
|
+
# Copyright © 2006-2008, Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
data/lib/bytestream-reader.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# This class is a simple File derivative from which you can read
|
4
4
|
# integers of different sizes, in any endianness.
|
5
5
|
#
|
6
|
-
# Copyright © 2007-2010 Diego
|
6
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
7
7
|
#
|
8
8
|
# Permission is hereby granted, free of charge, to any person
|
9
9
|
# obtaining a copy of this software and associated documentation files
|
data/lib/elf.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by glibc's elf.h
|
@@ -29,7 +29,7 @@ require 'elf/file'
|
|
29
29
|
require 'elf/section'
|
30
30
|
|
31
31
|
module Elf
|
32
|
-
VERSION = "1.0.
|
32
|
+
VERSION = "1.0.7"
|
33
33
|
|
34
34
|
MagicString = "\177ELF"
|
35
35
|
|
data/lib/elf/dynamic.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by elf.h
|
@@ -122,7 +122,7 @@ module Elf
|
|
122
122
|
0x7ffffffd => [ :Auxiliary, "AUXILIARY", :Value ]
|
123
123
|
)
|
124
124
|
|
125
|
-
OsSpecific =
|
125
|
+
OsSpecific = 0x60000000..0x6fffffff
|
126
126
|
ProcSpecific = 0x70000000..0x7fffffff
|
127
127
|
SpecialRanges = {
|
128
128
|
"DT_LOOS" => OsSpecific,
|
data/lib/elf/file.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by elf.h
|
@@ -339,6 +339,15 @@ module Elf
|
|
339
339
|
end
|
340
340
|
end
|
341
341
|
|
342
|
+
# Returns the hex address size for the file.
|
343
|
+
#
|
344
|
+
# Since each ELF file uses either 32- or 64-bit addresses, it is
|
345
|
+
# important to know how many characters a file's address would
|
346
|
+
# require when printed as an hexadecimal string.
|
347
|
+
def address_print_size
|
348
|
+
(@elf_class == Elf::Class::Elf32 ? 8 : 16)
|
349
|
+
end
|
350
|
+
|
342
351
|
def summary
|
343
352
|
$stdout.puts "ELF file #{path}"
|
344
353
|
$stdout.puts "ELF class: #{@elf_class} #{@data_encoding} ver. #{@version}"
|
data/lib/elf/gnu.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by elf.h
|
data/lib/elf/section.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by elf.h
|
data/lib/elf/stringtable.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Simple ELF parser for Ruby
|
3
3
|
#
|
4
|
-
# Copyright © 2007-2010 Diego
|
4
|
+
# Copyright © 2007-2010 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
5
5
|
# Portions inspired by elf.py
|
6
6
|
# Copyright © 2002 Netgraft Corporation
|
7
7
|
# Portions inspired by elf.h
|
@@ -22,28 +22,18 @@
|
|
22
22
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
23
23
|
|
24
24
|
require 'elf/section'
|
25
|
+
require 'elf/utils/offsettable'
|
25
26
|
|
26
27
|
module Elf
|
27
28
|
class StringTable < Section
|
28
29
|
def load_internal
|
29
|
-
@rawtable = @file.readexactly(@size)
|
30
|
-
end
|
31
|
-
|
32
|
-
class InvalidIndex < Exception
|
33
|
-
def initialize(idx, max_idx)
|
34
|
-
super("Invalid index #{idx} (maximum index: #{max_idx})")
|
35
|
-
end
|
30
|
+
@rawtable = Utilities::OffsetTable.new(@file.readexactly(@size), "\x00")
|
36
31
|
end
|
37
32
|
|
38
33
|
def [](idx)
|
39
34
|
load unless @rawtable
|
40
35
|
|
41
|
-
|
42
|
-
idx >= @rawtable.size
|
43
|
-
|
44
|
-
endidx = @rawtable.index("\x00", idx)
|
45
|
-
|
46
|
-
return @rawtable[idx..endidx].chomp("\x00")
|
36
|
+
@rawtable[idx]
|
47
37
|
end
|
48
38
|
end
|
49
39
|
end
|