1
0
Fork 0
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:
Marc-Andre Lafortune 2020-12-22 22:18:41 -05:00
parent 3df3b47187
commit 02233ed024

View file

@ -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]
} }