mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Adapt tool/search-cgvars.rb for MacOS
This commit is contained in:
parent
3df3b47187
commit
02233ed024
1 changed files with 18 additions and 5 deletions
|
@ -1,11 +1,16 @@
|
||||||
#
|
#
|
||||||
# Listing C's global variables in .so or .o using "objdump -t" (elf64-x86-64)
|
# Listing C's global variables in .so or .o, or .bundle on Mac OS using "objdump -t" (elf64-x86-64)
|
||||||
# to check ractor-safety.
|
# to check ractor-safety.
|
||||||
#
|
#
|
||||||
# Usage: ruby search-cgvars.rb foo.so bar.o
|
# Usage: ruby search-cgvars.rb foo.so bar.o .ext/x86_64-darwin18/psych.bundle
|
||||||
#
|
#
|
||||||
|
MAC_OS = RbConfig::CONFIG['host_os'].match? /darwin|mac os/
|
||||||
|
|
||||||
def gvars file
|
def gvars file
|
||||||
# '0000000000031ac8 g O .bss 0000000000000008 rb_cSockIfaddr'
|
# '0000000000031ac8 g O .bss 0000000000000008 rb_cSockIfaddr'
|
||||||
|
# On mac, with .bundle files:
|
||||||
|
# '0000000000004258 l O __DATA,__bss _passwd_blocking'
|
||||||
|
|
||||||
strs = `objdump -t #{file}`
|
strs = `objdump -t #{file}`
|
||||||
found = {}
|
found = {}
|
||||||
strs.each_line{|line|
|
strs.each_line{|line|
|
||||||
|
@ -13,10 +18,14 @@ def gvars file
|
||||||
addr = line[0...16]
|
addr = line[0...16]
|
||||||
flags = line[17...24].tr(' ', '').split(//).sort.uniq
|
flags = line[17...24].tr(' ', '').split(//).sort.uniq
|
||||||
rest = line[25..]
|
rest = line[25..]
|
||||||
seg, size, name = rest.split(/\s+/)
|
if MAC_OS
|
||||||
|
seg, name = rest.split(/\s+/)
|
||||||
|
else
|
||||||
|
seg, size, name = rest.split(/\s+/)
|
||||||
|
end
|
||||||
if flags.include?('O')
|
if flags.include?('O')
|
||||||
# p [addr, flags, seg, size, name]
|
# p [addr, flags, seg, size, name]
|
||||||
found[name] = [flags, seg, size]
|
found[name] = [flags, seg, *size]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
@ -25,14 +34,18 @@ def gvars file
|
||||||
[flags, name]
|
[flags, name]
|
||||||
}.each{|name, rest|
|
}.each{|name, rest|
|
||||||
flags, seg, size = *rest
|
flags, seg, size = *rest
|
||||||
next if size.to_i == 0 && seg != '*UND*'
|
next if (size.to_i == 0 && !MAC_OS) && seg != '*UND*'
|
||||||
case seg
|
case seg
|
||||||
when ".rodata", ".data.rel.ro", ".got.plt", ".eh_frame", ".fini_array"
|
when ".rodata", ".data.rel.ro", ".got.plt", ".eh_frame", ".fini_array"
|
||||||
next
|
next
|
||||||
|
when /,__const$/ # Mac OS
|
||||||
|
next
|
||||||
end
|
end
|
||||||
case name
|
case name
|
||||||
when /^id_/, /^rbimpl_id/, /^sym_/, /^rb_[cme]/, /\Acompleted\.\d+\z/
|
when /^id_/, /^rbimpl_id/, /^sym_/, /^rb_[cme]/, /\Acompleted\.\d+\z/
|
||||||
next
|
next
|
||||||
|
when /^_id_/, /\.rbimpl_id(\.\d+)?$/ # Mac OS
|
||||||
|
next
|
||||||
end
|
end
|
||||||
puts " %40s %s" % [name, rest.inspect]
|
puts " %40s %s" % [name, rest.inspect]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue