Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Simple ruby script to check that Objective-C static libraries are built with the latest ObjC ABI
#!/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 = {} do |opts|
opts.banner = 'Usage: staticlibchecker.rb [options]'
opts.on('-i', '--input-path FOLDER', 'Input path') { |v| options[:input_path] = v }
input_path = ""
if options[:input_path].nil?
raise "No input path specified"
input_path = options[:input_path]
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 -o #{path}"
stdout, stderr, status = Open3.capture3(command)
if !status.success?
puts "Failed with output: #{stderr}"
exit status.exitstatus
# extract 'flags' value
match = stdout.match /^\s+flags\s+(0x[\d]+)$/
if match
flags = Integer(match[1])
if (flags & category_class_var_flag) == category_class_var_flag
puts "File: #{File.basename(path)} is ok"
puts "File: #{File.basename(path)} was built with an old ABI version! #{flags} #{category_class_var_flag}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.