[前][次][番号順一覧][スレッド一覧]

ruby-changes:64494

From: Marc-Andre <ko1@a...>
Date: Wed, 23 Dec 2020 12:26:06 +0900 (JST)
Subject: [ruby-changes:64494] 3df3b47187 (master): Add tool/search-cgvars.rb, thanks @ko1

https://git.ruby-lang.org/ruby.git/commit/?id=3df3b47187

From 3df3b47187d7a137d4eb5a7887e9c8fa22a121c6 Mon Sep 17 00:00:00 2001
From: Marc-Andre Lafortune <github@m...>
Date: Tue, 22 Dec 2020 22:16:18 -0500
Subject: Add tool/search-cgvars.rb, thanks @ko1


diff --git a/tool/search-cgvars.rb b/tool/search-cgvars.rb
new file mode 100644
index 0000000..b368749
--- /dev/null
+++ b/tool/search-cgvars.rb
@@ -0,0 +1,42 @@ https://github.com/ruby/ruby/blob/trunk/tool/search-cgvars.rb#L1
+#
+# Listing C's global variables in .so or .o using "objdump -t" (elf64-x86-64)
+# to check ractor-safety.
+#
+# Usage: ruby search-cgvars.rb foo.so bar.o
+#
+def gvars file
+  # '0000000000031ac8 g     O .bss   0000000000000008              rb_cSockIfaddr'
+  strs = `objdump -t #{file}`
+  found = {}
+  strs.each_line{|line|
+    if /[\da-f]{16} / =~ line
+      addr = line[0...16]
+      flags = line[17...24].tr(' ', '').split(//).sort.uniq
+      rest = line[25..]
+      seg, size, name = rest.split(/\s+/)
+      if flags.include?('O')
+        # p [addr, flags, seg, size, name]
+        found[name] = [flags, seg, size]
+      end
+    end
+  }
+  puts "## #{file}:"
+  found.sort_by{|name, (flags, *)|
+    [flags, name]
+  }.each{|name, rest|
+    flags, seg, size = *rest
+    next if size.to_i == 0 && seg != '*UND*'
+    case seg
+    when ".rodata", ".data.rel.ro", ".got.plt", ".eh_frame", ".fini_array"
+      next
+    end
+    case name
+    when /^id_/, /^rbimpl_id/, /^sym_/, /^rb_[cme]/, /\Acompleted\.\d+\z/
+      next
+    end
+    puts "  %40s %s" % [name, rest.inspect]
+  }
+end
+ARGV.each{|file|
+  gvars file
+}
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]