summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorMarc-Andre Lafortune <github@marc-andre.ca>2020-12-22 22:18:41 -0500
committerMarc-Andre Lafortune <github@marc-andre.ca>2020-12-22 22:25:41 -0500
commit02233ed024095d67683330b2ee9df08d943a5cd0 (patch)
treec445eddad47915d198f06a87c71ddff6b429aa18 /tool
parent3df3b47187d7a137d4eb5a7887e9c8fa22a121c6 (diff)
Adapt tool/search-cgvars.rb for MacOS
Diffstat (limited to 'tool')
-rw-r--r--tool/search-cgvars.rb23
1 files changed, 18 insertions, 5 deletions
diff --git a/tool/search-cgvars.rb b/tool/search-cgvars.rb
index b368749910..c62641a3ff 100644
--- a/tool/search-cgvars.rb
+++ b/tool/search-cgvars.rb
@@ -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.
#
-# 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
# '0000000000031ac8 g O .bss 0000000000000008 rb_cSockIfaddr'
+ # On mac, with .bundle files:
+ # '0000000000004258 l O __DATA,__bss _passwd_blocking'
+
strs = `objdump -t #{file}`
found = {}
strs.each_line{|line|
@@ -13,10 +18,14 @@ def gvars file
addr = line[0...16]
flags = line[17...24].tr(' ', '').split(//).sort.uniq
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')
# p [addr, flags, seg, size, name]
- found[name] = [flags, seg, size]
+ found[name] = [flags, seg, *size]
end
end
}
@@ -25,14 +34,18 @@ def gvars file
[flags, name]
}.each{|name, 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
when ".rodata", ".data.rel.ro", ".got.plt", ".eh_frame", ".fini_array"
next
+ when /,__const$/ # Mac OS
+ next
end
case name
when /^id_/, /^rbimpl_id/, /^sym_/, /^rb_[cme]/, /\Acompleted\.\d+\z/
next
+ when /^_id_/, /\.rbimpl_id(\.\d+)?$/ # Mac OS
+ next
end
puts " %40s %s" % [name, rest.inspect]
}