Skip to content

umaumax/static-lib-dep-tree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

static-lib-dep-tree

static libraries link dependency visualization tool

maybe you can get proper link order by -v option

how to install

# for avoiding 'pip Installing collected packages: UNKNOWN'
pip3 install setuptools --upgrade
pip3 install https://github.com/umaumax/static-lib-dep-tree/archive/master.tar.gz
# required library
pip3 install graphviz

how to run

static-lib-dep-tree -o out.svg liba.a libb.a libc.a libd.a libe.a

static-lib-dep-tree -o out.svg liba.a libb.a libc.a libd.a libe.a liba.a

static-lib-dep-tree -o out.svg liba.a libb.a libc.a libd.a libe.a liba.a libc.a
static-lib-dep-tree -l -o out.svg liba.a libb.a libc.a libd.a libe.a

you can use below python script to find circular reference

$ static-lib-dep-tree -l -o out.dot liba.a libb.a libc.a libd.a libe.a
$ ./dot_find_cycles.py out.dot
['libe.a', 'liba.a', 'libd.a', 'libc.a']
['libe.a', 'liba.a', 'libc.a']
['libe.a', 'liba.a', 'libb.a', 'libc.a']
['libd.a', 'libc.a']
$ static-lib-dep-tree -l -o opencv-dep.svg /usr/local/lib/libopencv*.a --enable-multi-edges -v
/usr/local/lib/libopencv_superres.a /usr/local/lib/libopencv_optflow.a /usr/local/lib/libopencv_bgsegm.a /usr/local/lib/libopencv_xobjdetect.a /usr/local/lib/libopencv_stereo.a /usr/local/lib/libopencv_face.a /usr/local/lib/libopencv_videostab.a /usr/local/lib/libopencv_tracking.a /usr/local/lib/libopencv_ximgproc.a /usr/local/lib/libopencv_stitching.a /usr/local/lib/libopencv_ccalib.a /usr/local/lib/libopencv_video.a /usr/local/lib/libopencv_aruco.a /usr/local/lib/libopencv_rgbd.a /usr/local/lib/libopencv_objdetect.a /usr/local/lib/libopencv_shape.a /usr/local/lib/libopencv_sfm.a /usr/local/lib/libopencv_structured_light.a /usr/local/lib/libopencv_datasets.a /usr/local/lib/libopencv_calib3d.a /usr/local/lib/libopencv_xfeatures2d.a /usr/local/lib/libopencv_videoio.a /usr/local/lib/libopencv_xphoto.a /usr/local/lib/libopencv_text.a /usr/local/lib/libopencv_surface_matching.a /usr/local/lib/libopencv_imgcodecs.a /usr/local/lib/libopencv_img_hash.a /usr/local/lib/libopencv_line_descriptor.a /usr/local/lib/libopencv_highgui.a /usr/local/lib/libopencv_dpm.a /usr/local/lib/libopencv_freetype.a /usr/local/lib/libopencv_gapi.a /usr/local/lib/libopencv_hfs.a /usr/local/lib/libopencv_features2d.a /usr/local/lib/libopencv_plot.a /usr/local/lib/libopencv_reg.a /usr/local/lib/libopencv_saliency.a /usr/local/lib/libopencv_photo.a /usr/local/lib/libopencv_dnn.a /usr/local/lib/libopencv_quality.a /usr/local/lib/libopencv_bioinspired.a /usr/local/lib/libopencv_dnn_objdetect.a /usr/local/lib/libopencv_fuzzy.a /usr/local/lib/libopencv_flann.a /usr/local/lib/libopencv_imgproc.a /usr/local/lib/libopencv_ml.a /usr/local/lib/libopencv_phase_unwrapping.a /usr/local/lib/libopencv_core.a
$ pkg-config --libs opencv4
-L/usr/local/Cellar/opencv/4.1.1_2/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_highgui -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_video -lopencv_videoio -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core

how to run test

cd $(git rev-parse --show-toplevel)
# run all
python -m unittest discover tests
# run with filter
python -m unittest discover -p 'test*.py'

個別のモジュールをテストする場合(このときは,./tests/__init__.pyを作成する必要がある)

cd $(git rev-parse --show-toplevel)
# <test dir name>.<test_target python file name without ext>
python -m unittest tests.test_static_lib_dep_tree
python -m unittest tests.test_static_lib_dep_tree.TestStaticLibDepTree
python -m unittest tests.test_static_lib_dep_tree.TestStaticLibDepTree.test_filter_defined_symbol_normal

color output

pip install green
green
green -v
green -vv
green -vvv

green tests.test_static_lib_dep_tree.TestStaticLibDepTree.test_filter_defined_symbol_normal

how to run coverage

Djangoメモ(26) : coverage.pyでカバレッジ(網羅率)を計測 - もた日記

pip install coverage
coverage run --source='.' --omit='*/tests/*' -m unittest discover tests

you can use .coveragerc

coverage report -m
coverage report -m --omit='*/tests/*'

coverage report -m static_lib_dep_tree/static_lib_dep_tree.py
coverage html static_lib_dep_tree/static_lib_dep_tree.py
open htmlcov/index.html
coverage erase

figures

  • [x] -> [y]: x depends y

out.dot.svg

how to build static libs

for f in `ls *.cpp`; do g++ -std=c++11 $f -c -o ${f%.cpp}.o; ar r lib${f%.cpp}.a ${f%.cpp}.o; done

for f in `ls *.cpp`; do g++ -std=c++11 $f -c -o ${f%.cpp}.o; done

g++ -std=c++11 add.cpp -c -o add.o
ar r libadd.a add.o
g++ -std=c++11 sub.cpp -c -o sub.o
ar r libsub.a sub.o

ar r libabced.a a.o b.o c.o d.o e.o

nm command output examples

# Max OS X
$ nm -A libadd.a
libadd.a:add.o: 0000000000000000 T __Z3addii
libadd.a:add.o:                  U __Z3subii
$ nm -A libsub.a
libsub.a:sub.o: 0000000000000000 T __Z3subii

# Ubuntu 16.04
$ nm -A libadd.a
libadd.a:add.o:0000000000000000 T __Z3addii
libadd.a:add.o:                 U __Z3subii
$ nm -A libsub.a
libsub.a:sub.o:0000000000000000 T __Z3subii

FMI

check list

  • .aの中の.oの依存関係による自己ループ
  • .aの中の.oの仕様の確認
  • .aから他の.aへの複数の依存エッジ
  • ループしてリンク先を検索した際に見つかる定義とそうでないものを分ける
    • 1.ループなしでlinkを行う
    • 2.ループありでlinkを行う(このときに,新規にlinkできたものに対してflagをONとし,これは,ループすれば見つかるシンボルを表す)
    • NOTE: 1.と2.は指定ライブラリをすべて一巡せずにその場で行っても問題ない(liba.a libb.a liba.aという重複パターンにおいても)
  • 可視化したsvgを上から順番に見ていけば、依存関係の解決が可能だが,CUI的なoutputは?
    • networkx libraryを利用?
  • 依存性のないライブラリに色を付ける
  • networkxで書き直し
  • 複数エッジ表現を本数以外に,太さで表現したい(描画の幅の省略ため)
    • penwidthを利用
  • 共有ライブラリへの対応
    • lddtreeで、依存はしているが実は不使用な共有ライブラリの洗い出しが可能

NOTE

unittest links

基本(ディレクトリ構成/コマンド)

書き方

other tools?

cargo install --git https://github.com/jameysharp/static-ldd

では,buildエラーとなるので,下記のpatchを当てて,cargo installとするとビルドはできるが,想定通りの挙動とならず

diff --git a/Cargo.toml b/Cargo.toml
index a8e88d2..02c2baf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,5 +10,5 @@ description = """A library and command-line tool for inferring
 dependencies between static libraries."""
 
 [dependencies]
-filebuffer = "0.2.0"
+filebuffer = "0.4.0"
 goblin = "0.0.10"

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published