關於Linux C程序存儲空間的邏輯佈局

來源:文萃谷 3.2W

Linux C程序存儲空間的邏輯佈局是怎麼樣的?為了方便大家,下面YJBYS小編為大家整理了關於Linux C程序存儲空間的邏輯佈局的文章,希望對你有所幫助。

關於Linux C程序存儲空間的邏輯佈局

  一、APUE上指出了 Linux C程序存儲空間的邏輯佈局,對於 X86上的`Linux

正文段從 0x08048000單元開始

棧底則在 0xC0000000之下開始 (棧從高地址向低地址生長)

圖如下:

  二、例程

實現一個函數f(),不用指針,實現在函數內修改傳入參數的值。

#include "stdio.h"

#include "sys/types.h"

void f1(u_int32_t a)

{

printf("%pn", &a);

u_int8_t *ap = (u_int8_t *)&a;

while(++ap)

{

printf("%pn", ap);

if( *ap == a)

{

*ap = 7;

break;

}

}

}

main()

{

u_int32_t i = 123;

printf("%pn", &i);

f1(i);

printf("%dn", i);

}

運行結果

/* * * result * * */

/*

BTC:/home/leon/test # ./

0xbf905300

0xbf9052e0

0xbf9052e1

0xbf9052e2

0xbf9052e3

0xbf9052e4

0xbf9052e5

0xbf9052e6

0xbf9052e7

0xbf9052e8

0xbf9052e9

0xbf9052ea

0xbf9052eb

0xbf9052ec

0xbf9052ed

0xbf9052ee

0xbf9052ef

0xbf9052f0

0xbf9052f1

0xbf9052f2

0xbf9052f3

0xbf9052f4

0xbf9052f5

0xbf9052f6

0xbf9052f7

0xbf9052f8

0xbf9052f9

0xbf9052fa

0xbf9052fb

0xbf9052fc

0xbf9052fd

0xbf9052fe

0xbf9052ff

0xbf905300

7

*/

從結果可以清晰的看到:

1 進入函數f1()後,棧“向下”生長了。

2 通過直接訪問棧內容,修改了棧內的值。

注:這種操作相當不安全,因為不能保證棧內沒有其它相同的值。

熱門標籤