一个哈希函数(如下的)接受一个符号名并且返回一个能够被电脑使用的bucket索引
的值。因此,假如一个哈希函数返回一些名字的值为X,那么bucket[x%nbucket]
将给出一个索引y(既是符号表和chain表的索引)。假如符号表入口不是期望的,
chain[y]给出下一个符号表的入口(使用相同的哈希变量)。能够沿着chain
链直到选择到了期望名字的符号表入口或是碰到了STN_UNDEF的入口。
Figure 2-15: Hashing Function
unsigned long
elf_hash(const unsigned char *name)
{
unsigned long h = 0, g;
while (*name) {
h = (h << 4) *name ;
if (g = h & 0xf0000000)
h ^= g >> 24;
h &= ~g;
}
return h;
}
Initialization and Termination Functions
初始化和终止函数
在动态连接妻建立进程映象和执行重定位以后,每一个共享object得到适当
的机会来执行一些初始话代码。初始化函数不按特别的顺序被调用,但是
任何的共享object初始化发生在执行程式获得控制之前。
类似地,共享的object可能包含终止函数,他们在进程本身开始他的终止之后
被执行(以atexit(BA_OS)的机制)。
共享object通过配置在动态结构中的DT_INIT和DT_FINI入口来指派他们的初始化
和终止函数,如上动态section(Dynamic Section)部分描述。典型的,那些函数
代码存在.init和.fini section中,第一部分的“section”已提到过。
注意:尽管atexit(BA_OS)的终止处理一般可可正常完成,但是不确保在死进程上
被执行。特别的,假如_exit被调用(看exit(BA_OS))或假如进程死掉,那么
进程是不执行终止处理的。因为他收到一个信号,该信号可捕获或忽略。
________________________________________________________________
3. C LIBRARY
________________________________________________________________
========================== C Library ===========================
C库,libc,包含了任何的符号(包含在libsys),另外,包含在在下面两个
表中列出的运行函数。第一个表中的运行函数是ANSI C标准的。
Figure 3-1: libc Contents, Names without Synonyms
abort fputc isprint putc strncmp
abs fputs ispunct putchar strncpy
asctime fread isspace puts strpbrk
atof freopen isupper qsort strrchr
atoi frexp isxdigit raise strspn
atol fscanf labs rand strstr
bsearch fseek ldexp rewind strtod
clearerr fsetpos ldiv scanf strtok
clock ftell localtime setbuf strtol
ctime fwrite longjmp setjmp strtoul
difftime getc mblen setvbuf tmpfile
div getchar mbstowcs sprintf tmpnam
fclose getenv mbtowc srand tolower
feof gets memchr sscanf toupper
ferror gmtime memcmp strcat ungetc
fflush isalnum memcpy strchr vfprintf
fgetc isalpha memmove strcmp vprintf
fgetpos iscntrl memset strcpy vsprintf
fgets isdigit mktime strcspn wcstombs
fopen isgraph perror strlen wctomb
fprintf islower printf strncat
再加上, libc 保存着以下的服务。
Figure 3-2: libc Contents, Names with Synonyms
__assert getdate lockf ** sleep tell **
cfgetispeed getopt lsearch strdup tempnam
cfgetospeed getpass memccpy swab tfind
cfsetispeed getsubopt mkfifo tcdrain toascii
cfsetospeed getw mktemp tcflow _tolower
ctermid hcreate monitor tcflush tsearch
cuserid hdestroy nftw tcgetattr _toupper
dup2 hsearch nl_langinfo tcgetpgrp twalk
fdopen isascii pclose tcgetsid tzset
__filbuf isatty popen tcsendbreak _xftw
fileno isnan putenv tcsetattr
__flsbuf isnand ** putw tcsetpgrp
fmtmsg ** lfind setlabel tdelete
** = Function is at Level 2 in the SVID Issue 3 and therefore at
Level 2 in the ABI.
包括上面同义(Synonyms)表列出的标号,对于
形式(带一个下划线,上面没有列出来)优先权高于他们的名字。所以,例如,
libc同时包含了getopt和_getopt。
在常规的上列中,其他地方以下没有被定义。
int __filbuf(FILE *f);
This function returns the next input character for f, filling
its buffer as appropriate. It returns EOF if an error occurs.
int __flsbuf(int x, FILE *f);
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




