一、鏈接腳本
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 生成動態庫