summaryrefslogtreecommitdiff
path: root/win32/mkexports.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-28 08:50:41 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-28 08:50:41 +0000
commita9396fd580a40ab02d50b65fe38c7d4c35ebe3cd (patch)
tree862edbdf0a1a6c8b9ffc42622050c8fc398e44f3 /win32/mkexports.rb
parent23c2cf545c3302aa65cde911d0492475a6ad2bec (diff)
* win32/mkexports.rb (Exports#objdump, Exports#each_line): extracted.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16669 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32/mkexports.rb')
-rwxr-xr-xwin32/mkexports.rb60
1 files changed, 38 insertions, 22 deletions
diff --git a/win32/mkexports.rb b/win32/mkexports.rb
index e000fcf..2ed251e 100755
--- a/win32/mkexports.rb
+++ b/win32/mkexports.rb
@@ -27,7 +27,7 @@ class Exports
def self.output(output = $output, &block)
if output
- open(output, 'w', &block)
+ open(output, 'wb', &block)
else
yield STDOUT
end
@@ -74,38 +74,50 @@ class Exports
def each_export(objs)
end
+ def objdump(objs, &block)
+ if objs.empty?
+ $stdin.each_line(&block)
+ else
+ each_line(objs, &block)
+ end
+ end
+
def symbols()
@syms.sort.collect {|k, v| v ? v == true ? "#{k} DATA" : "#{k}=#{v}" : k}
end
end
class Exports::Mswin < Exports
+ def each_line(objs, &block)
+ IO.popen(%w"dumpbin -symbols -exports" + objs) do |f|
+ f.each(&block)
+ end
+ end
+
def each_export(objs)
noprefix = ($arch ||= nil and /^(sh|i\d86)/ !~ $arch)
objs = objs.collect {|s| s.tr('/', '\\')}
filetype = nil
- IO.popen(%w"dumpbin -symbols -exports" + objs) do |f|
- f.each do |l|
- if (filetype = l[/^File Type: (.+)/, 1])..(/^\f/ =~ l)
- case filetype
- when /OBJECT/, /LIBRARY/
- next if /^[[:xdigit:]]+ 0+ UNDEF / =~ l
- next unless /External/ =~ l
- next unless l.sub!(/.*?\s(\(\)\s+)?External\s+\|\s+/, '')
- is_data = !$1
- if noprefix or /^[@_]/ =~ l
- next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{16}$/ =~ l
- l.sub!(/^[@_]/, '') if /@\d+$/ !~ l
- elsif !l.sub!(/^(\S+) \([^@?\`\']*\)$/, '\1')
- next
- end
- when /DLL/
- next unless l.sub!(/^\s*\d+\s+[[:xdigit:]]+\s+[[:xdigit:]]+\s+/, '')
- else
+ objdump(objs) do |l|
+ if (filetype = l[/^File Type: (.+)/, 1])..(/^\f/ =~ l)
+ case filetype
+ when /OBJECT/, /LIBRARY/
+ next if /^[[:xdigit:]]+ 0+ UNDEF / =~ l
+ next unless /External/ =~ l
+ next unless l.sub!(/.*?\s(\(\)\s+)?External\s+\|\s+/, '')
+ is_data = !$1
+ if noprefix or /^[@_]/ =~ l
+ next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{16}$/ =~ l
+ l.sub!(/^[@_]/, '') if /@\d+$/ !~ l
+ elsif !l.sub!(/^(\S+) \([^@?\`\']*\)$/, '\1')
next
end
- yield l.strip, is_data
+ when /DLL/
+ next unless l.sub!(/^\s*\d+\s+[[:xdigit:]]+\s+[[:xdigit:]]+\s+/, '')
+ else
+ next
end
+ yield l.strip, is_data
end
end
yield "strcasecmp", "msvcrt.stricmp"
@@ -118,9 +130,13 @@ class Exports::Mingw < Exports
@@nm ||= RbConfig::CONFIG["NM"]
end
+ def each_line(objs, &block)
+ IO.foreach("|#{self.class.nm} --extern --defined #{objs.join(' ')}", &block)
+ end
+
def each_export(objs)
- IO.popen([self.class.nm, "--extern", "--defined", *objs]) do |f|
- f.each {|l| yield $1 if / [[:upper:]] _(.*)$/ =~ l}
+ objdump(objs) do |l|
+ yield $1 if / [[:upper:]] _(.*)$/ =~ l
end
yield "strcasecmp", "_stricmp"
yield "strncasecmp", "_strnicmp"