Skip to content

Instantly share code, notes, and snippets.

@snipsnipsnip
Last active August 24, 2019 15:36
Show Gist options
  • Save snipsnipsnip/149568 to your computer and use it in GitHub Desktop.
Save snipsnipsnip/149568 to your computer and use it in GitHub Desktop.
dll2lib: make lib file from dll using msvc's dumpbin and lib (requires ruby)
@ruby -x "%~f0" %*
@exit /b
#!ruby
def dumpbin(filename)
`dumpbin /exports #{filename}`
end
def extract_function_names(exports)
exports[/^\s+ordinal.*^\s+Summary/m].scan(/\s+[A-Z\d+]{8}\s+(\w+)$/)
end
def write_def(names, defname)
open(defname, 'w') do |f|
f.puts "EXPORTS"
names.each do |name|
f.puts " #{name}"
end
end
end
def lib(defname, libname)
system "lib /nologo /machine:x86 /subsystem:native /def:#{defname} /out:#{libname}"
end
def main
ARGV.each do |filename|
ext = File.extname filename
defname = filename.sub(ext, '.def')
libname = filename.sub(ext, '.lib')
exports = dumpbin(filename)
names = extract_function_names(exports)
write_def(names, defname)
lib(defname, libname)
end
end
main if $0 == __FILE__
@def dumpbin(filename)
`dumpbin /exports #{filename}`
end
def extract_function_names(exports)
exports[/^\s+ordinal.*^\s+Summary/m].scan(/\s+[A-Z\d+]{8}\s+(\w+)$/)
end
def write_def(names, defname)
open(defname, 'w') do |f|
f.puts "EXPORTS"
names.each do |name|
f.puts " #{name}"
end
end
end
def lib(defname, libname)
system "lib /nologo /machine:x86 /subsystem:native /def:#{defname} /out:#{libname}"
end
def main
ARGV.each do |filename|
ext = File.extname filename
defname = filename.sub(ext, '.def')
libname = filename.sub(ext, '.lib')
exports = dumpbin(filename)
names = extract_function_names(exports)
write_def(names, defname)
lib(defname, libname)
end
end
main if $0 == __FILE__
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment