Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save honood/66a1d28f81b9fa2f7d7c49de6a36dda4 to your computer and use it in GitHub Desktop.
Save honood/66a1d28f81b9fa2f7d7c49de6a36dda4 to your computer and use it in GitHub Desktop.

Revisions

  1. @dynamicdispatch dynamicdispatch created this gist Sep 22, 2017.
    47 changes: 47 additions & 0 deletions staticlibobjcabichecker.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,47 @@
    #!/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 -o #{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) == category_class_var_flag
    puts "File: #{File.basename(path)} is ok"
    else
    puts "File: #{File.basename(path)} was built with an old ABI version! #{flags} #{category_class_var_flag}"
    end
    end
    }