Skip to content

Instantly share code, notes, and snippets.

@dynamicdispatch
Created September 7, 2017 17:47
Show Gist options
  • Save dynamicdispatch/049328782d233551d2edc5dabe95c281 to your computer and use it in GitHub Desktop.
Save dynamicdispatch/049328782d233551d2edc5dabe95c281 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'optparse'
require 'pathname'
require 'open3'
# This tool checks an input path for all static libraries *.a files
# and makes sure they were built with the most modern ObjC ABI version.
# Parse command line options.
options = {}
OptionParser.new do |opts|
opts.banner = 'Usage: staticlibchecker.rb [options]'
opts.on('-i', '--input-path FOLDER', 'Input path') { |v| options[:input_path] = v }
end.parse!
input_path = ""
if options[:input_path].nil?
raise "No input path specified"
else
input_path = options[:input_path]
end
all_static_libs = Dir["#{input_path}/**/*.a"]
puts all_static_libs
category_class_var_flag = 1<<6
all_static_libs.each { |path|
# Run otool against the static lib
command = "otool -ov #{path}"
stdout, stderr, status = Open3.capture3(command)
if !status.success?
puts "Failed with output: #{stderr}"
exit status.exitstatus
end
# extract 'flags' value
match = stdout.match /^\s+flags\s+(0x[\d]+)$/
if match
flags = Integer(match[1])
if flags & category_class_var_flag == 0
puts "File: #{File.basename(path)} was built with an old ABI version!"
end
end
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment