Skip to content

Instantly share code, notes, and snippets.

@easyui
Forked from bang590/linkmap.js
Created July 4, 2017 08:45
Show Gist options
  • Select an option

  • Save easyui/16214e8d5043e582c6ffc0cfb22ff213 to your computer and use it in GitHub Desktop.

Select an option

Save easyui/16214e8d5043e582c6ffc0cfb22ff213 to your computer and use it in GitHub Desktop.

Revisions

  1. @bang590 bang590 revised this gist Jan 31, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion linkmap.js
    Original file line number Diff line number Diff line change
    @@ -133,7 +133,7 @@ if (opts && opts[0] == '-') {
    var linkmap = new LinkMap(process.argv[2])
    linkmap.start(function(){
    var ret = isStatLib ? linkmap.statLibs(isFomatSize)
    : linkmap.statFiles(isFomatSize)
    : linkmap.statFiles(isFomatSize)
    for (var i in ret) {
    console.log(ret[i].name + '\t' + ret[i].size)
    }
  2. @bang590 bang590 created this gist Jan 31, 2015.
    140 changes: 140 additions & 0 deletions linkmap.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,140 @@
    var readline = require('readline'),
    fs = require('fs');

    var LinkMap = function(filePath) {
    this.files = []
    this.filePath = filePath
    }

    LinkMap.prototype = {
    start: function(cb) {
    var self = this
    var rl = readline.createInterface({
    input: fs.createReadStream(self.filePath),
    output: process.stdout,
    terminal: false
    });
    var currParser = "";
    rl.on('line', function(line) {
    if (line[0] == '#') {
    if (line.indexOf('Object files') > -1) {
    currParser = "_parseFiles";
    } else if (line.indexOf('Sections') > -1) {
    currParser = "_parseSection";
    } else if (line.indexOf('Symbols') > -1) {
    currParser = "_parseSymbols";
    }
    return;
    }
    if (self[currParser]) {
    self[currParser](line)
    }
    });

    rl.on('close', function(line) {
    cb(self)
    });
    },

    _parseFiles: function(line) {
    var arr =line.split(']')
    if (arr.length > 1) {
    var idx = Number(arr[0].replace('[',''));
    var file = arr[1].split('/').pop().trim()
    this.files[idx] = {
    name: file,
    size: 0
    }
    }
    },

    _parseSection: function(line) {
    },

    _parseSymbols: function(line) {
    var arr = line.split('\t')
    if (arr.length > 2) {
    var size = parseInt(arr[1], 16)
    var idx = Number(arr[2].split(']')[0].replace('[', ''))
    if (idx && this.files[idx]) {
    this.files[idx].size += size;
    }
    }
    },

    _formatSize: function(size) {
    if (size > 1024 * 1024) return (size/(1024*1024)).toFixed(2) + "MB"
    if (size > 1024) return (size/1024).toFixed(2) + "KB"
    return size + "B"
    },

    statLibs: function(h) {
    var libs = {}
    var files = this.files;
    var self = this;
    for (var i in files) {
    var file = files[i]
    var libName
    if (file.name.indexOf('.o)') > -1) {
    libName = file.name.split('(')[0]
    } else {
    libName = file.name
    }
    if (!libs[libName]) {
    libs[libName] = 0
    }
    libs[libName] += file.size
    }
    var i = 0, sortLibs = []
    for (var name in libs) {
    sortLibs[i++] = {
    name: name,
    size: libs[name]
    }
    }
    sortLibs.sort(function(a,b) {
    return a.size > b.size ? -1: 1
    })
    if (h) {
    sortLibs.map(function(o) {
    o.size = self._formatSize(o.size)
    })
    }
    return sortLibs
    },

    statFiles: function(h) {
    var self = this
    self.files.sort(function(a,b) {
    return a.size > b.size ? -1: 1
    })
    if (h) {
    self.files.map(function(o) {
    o.size = self._formatSize(o.size)
    })
    }
    return this.files
    }
    }

    if (!process.argv[2]) {
    console.log('usage: node linkmap.js filepath -hl')
    console.log('-h: format size')
    console.log('-l: stat libs')
    return
    }
    var isStatLib, isFomatSize
    var opts = process.argv[3];
    if (opts && opts[0] == '-') {
    if (opts.indexOf('h') > -1) isFomatSize = true
    if (opts.indexOf('l') > -1) isStatLib = true
    }

    var linkmap = new LinkMap(process.argv[2])
    linkmap.start(function(){
    var ret = isStatLib ? linkmap.statLibs(isFomatSize)
    : linkmap.statFiles(isFomatSize)
    for (var i in ret) {
    console.log(ret[i].name + '\t' + ret[i].size)
    }
    })