<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    靜態鏈接

    鏈接一共分為兩種,靜態鏈接和動態鏈接,其中動態鏈接的相關理論是支撐pwn的基礎,非常重要。

    靜態庫與靜態鏈接

    靜態庫可以簡單的看成一組目標文件的集合,即很多目標文件經過壓縮打包后形成的文件。比如在我們日常編程中,如果需要使用printf函數,就需要包stdio.h的庫文件,使用strlen時,又需要包string.h的庫文件,可是如果直接把對應函數源碼編譯后形成的.o文件直接提供給我們,將會對我們的管理和使用上造成極大不便,于是可以使用**“ar”**壓縮程序將這些目標文件壓縮在一起,形成libx.a靜態庫文件。

    注:靜態庫命名格式:lib + “庫名稱”+ .a(后綴) 例:libadd.a就是一個叫add的靜態庫

    舉例
    例如在開源密碼庫botan下,我們可以直接生成libbotan-2.a這個靜態庫,在CMakelist中我們引用靜態庫即可使用封裝好的函數。我們從Makefile中即可看到整個libbotan-2.a靜態庫的具體生成過程。
    Makefile

    # Compiler Flags 編譯參數,我們可以根據需要進行修改
    ABI_FLAGS      =  -fstack-protector -m64 -pthread
    LANG_FLAGS     = -std=c++11 -D_REENTRANT 
    CXXFLAGS       = -O3 -DBOTAN_IS_BEING_BUILT
    WARN_FLAGS     = -Wall -Wextra -Wpedantic -Wstrict-aliasing -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wzero-as-null-pointer-constant -Wnon-virtual-dtor
    LIB_FLAGS      = 
    LDFLAGS        = 
    EXE_LINK_CMD   = $(LINKER) -Wl,-rpath=\$$ORIGIN 
    POST_LINK_CMD  = 
    LIB_LINKS_TO   = 
    EXE_LINKS_TO   = -L. -lbotan-2 $(LIB_LINKS_TO)
    BUILD_FLAGS    = $(ABI_FLAGS) $(LANG_FLAGS) $(CXXFLAGS) $(WARN_FLAGS)
    SCRIPTS_DIR    = src/scripts
    INSTALLED_LIB_DIR = /usr/local/lib
    # Object Files 需要包含的目標.o文件
    LIBOBJS = build/obj/lib/asn1_alg_id.o build/obj/lib/asn1_attribute.o build/obj/lib/asn1_obj.o build/obj/lib/asn1_oid.o build/obj/lib/asn1_print.o build/obj/lib/asn1_str.o ......
    # Library targets
    ./libbotan-2.a: $(LIBOBJS)
        $(AR) $(AR_OPTIONS) $@ $(LIBOBJS)
    # Build Commands 生成.o文件具體指令
    build/obj/lib/asn1_alg_id.o: src/lib/asn1/alg_id.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/alg_id.cpp -o $@
    build/obj/lib/asn1_attribute.o: src/lib/asn1/asn1_attribute.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/asn1_attribute.cpp -o $@
    build/obj/lib/asn1_obj.o: src/lib/asn1/asn1_obj.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/asn1_obj.cpp -o $@
    build/obj/lib/asn1_oid.o: src/lib/asn1/asn1_oid.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/asn1_oid.cpp -o $@
    build/obj/lib/asn1_print.o: src/lib/asn1/asn1_print.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/asn1_print.cpp -o $@
    build/obj/lib/asn1_str.o: src/lib/asn1/asn1_str.cpp
        $(CXX) $(LIB_FLAGS) $(BUILD_FLAGS)  -Ibuild/include -c src/lib/asn1/asn1_str.cpp -o $@

    這樣我們在Makefile目錄下直接執行make操作就可以生成相應的libxxx.a靜態庫文件了。
    對于靜態庫,程序在編譯鏈接時,將庫的代碼鏈接到可執行文件中,程序運行時不再需要靜態庫。在使用過程中只需要將庫和我們的程序編譯后的文件鏈接在一起就可形成一個可執行文件。
    缺點:
    1、內存和磁盤空間浪費:靜態鏈接方式對于計算機內存和磁盤的空間浪費十分嚴重。假如一個c語言的靜態庫大小為1MB,系統中有100個需要使用到該庫文件,采用靜態鏈接的話,就要浪費進100M的內存,若數量再大,那浪費的也就更多。
    2. 更新麻煩:比如一個程序20個模塊,每個模塊只有1MB,那么每次更新任何一個模塊,用戶都得重新下載20M的程序。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类