一、鏈接腳本

SECTIONS

{

/* Read-only sections, merged into text segment: */

 PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;

 .rel.plt        :

   {

   }

 .init           :

 {

 } =0x90909090

 .plt            : { *(.plt) *(.iplt) }

 .text           :

 {

 } =0x90909090

 .fini           :

 {

 } =0x90909090

 .rodata{}

 .dtors          :

 {

 }

 .data           :

 {

 }

 _edata = .; PROVIDE (edata = .);

 __bss_start = .;

 .bss            :

}

1.executable_star指示0x08048000為程序入口

2.如上簡潔腳本中.rel.plt到.rodata之間為代碼段,之後為數據段

3.之所以將一些看似不同的數據或代碼放到一起、是由於要將其設置為共同的權限(其實代碼也是數據)

二、靜態庫

假設有一個main.c 三個a.c、b.c、c.c獨立函數文件

以下是靜態庫實現過程

gcc -c a.c b.c c.c

ar rs libstack.a a.o b.o c.o     生成靜態庫libstack.a

gcc main.c -L. -lstack -o main   //lstack告訴編譯器鏈接libstack庫 -L告訴編譯器去哪了找庫文件

三、共享庫

假設有一個main.c 三個a.c、b.c、c.c獨立函數文件

以下是共享庫實現過程

gcc -c -fPIC a.c b.c c.c    生成共享庫、位置無關代碼(在鏈接時可以把目標文件中各段的地址做重定位)

gcc -g main.c a.o b.o c.o -o main

gcc -shared -o libstack.so main 生成動態庫