打印堆棧中的初始化信息

進程初始化的時候,堆棧裏面保存了關於進程執行環境和命令行參數等信息。事實上,堆棧裏面還保存了動態鏈接器所需要的一些輔助信息數組(Auxiliary Vector)。那麼進程執行環境、命令行參數信息以及輔助信息數組在進程堆棧中是怎麼分佈的呢?

我們可以使用如下的一個小程序(auxiliary_vestor.c)顯示之:

#include<stdio.h>
#include<elf.h>

int main(int argc, char * argv[])
{
      int *p = (int *)argv;
      int i;
      Elf32_auxv_t *aux;

      printf("Argument count:%d\n", *(p-1) );
      for(i=0; i<*(p-1); i++)
      {
            printf("Argument %d : %s\n", i, *(p+i) );
      }
      p += i;
      p++;

      printf("Environment:\n");
      while(*p)
      {
            printf("%s\n", *p);
            p++;
      }

      p++;

      printf("Auxiliary Vectors:\n");
      aux = (Elf32_auxv_t *)p;
      while(aux->a_type != AT_NULL)
      {
            printf("Type: %02d Value: %x\n", aux->a_type, aux->a_un.a_val);
            aux++;
      }

      return 0;
}

上述程序中使用了輔助信息數組的結構,它被定義在elf.h中:

typedef struct
{
	uint32_t a_type;
	union
	{
		uint32_t a_val;
	}a_un;
}Elf32_auxv_t;

gcc -g auxiliary_vector.c -o auxiliary_vector

./auxiliary_vector heshuang write

程序運行結果如下:

Argument count:3
Argument 0 : ./auxiliary_vector
Argument 1 : heshuang
Argument 2 : write
Environment:
SSH_AGENT_PID=1524
GPG_AGENT_INFO=/tmp/keyring-twYZ4a/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=41039a83fa6262cfc72afc1e00000006-1385343710.39082-378826950
WINDOWID=62914565
GNOME_KEYRING_CONTROL=/tmp/keyring-twYZ4a
GTK_MODULES=canberra-gtk-module:canberra-gtk-module
USER=hs
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/tmp/keyring-twYZ4a/ssh
USERNAME=hs
DEFAULTS_PATH=/usr/share/gconf/ubuntu-2d.default.path
SESSION_MANAGER=local/hs-virtual-machine:@/tmp/.ICE-unix/1492,unix/hs-virtual-machine:/tmp/.ICE-unix/1492
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu-2d:/etc/xdg
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
DESKTOP_SESSION=ubuntu-2d
QT_IM_MODULE=xim
PWD=/home/hs/program/C-program/程序員的自我修養
XMODIFIERS=@im=ibus
GNOME_KEYRING_PID=1483
LANG=zh_CN.UTF-8
MANDATORY_PATH=/usr/share/gconf/ubuntu-2d.mandatory.path
UBUNTU_MENUPROXY=libappmenu.so
GDMSESSION=ubuntu-2d
SHLVL=1
HOME=/home/hs
LANGUAGE=zh_CN:zh
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=hs
XDG_DATA_DIRS=/usr/share/ubuntu-2d:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-tYpEHv9TD3,guid=e54092127d5ebd0d453565fa00000017
LESSOPEN=| /usr/bin/lesspipe %s
DISPLAY=:0
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=ibus
LESSCLOSE=/usr/bin/lesspipe %s %s
COLORTERM=gnome-terminal
XAUTHORITY=/home/hs/.Xauthority
OLDPWD=/home/hs
_=./auxiliary_vector
Auxiliary Vectors:
Type: 32 Value: 480414
Type: 33 Value: 480000
Type: 16 Value: 1febf3ff
Type: 06 Value: 1000
Type: 17 Value: 64
Type: 03 Value: 8048034
Type: 04 Value: 20
Type: 05 Value: 9
Type: 07 Value: c13000
Type: 08 Value: 0
Type: 09 Value: 8048360
Type: 11 Value: 3e8
Type: 12 Value: 3e8
Type: 13 Value: 3e8
Type: 14 Value: 3e8
Type: 23 Value: 0
Type: 25 Value: bfee1b7b
Type: 31 Value: bfee3fe9
Type: 15 Value: bfee1b8b

從上面的運行結果,可以得出進程堆棧中的內容分佈大致如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章