LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1607|回复: 8

帮忙解释一下这几个GCC编译选项的具体意思

[复制链接]
发表于 2003-6-27 09:29:50 | 显示全部楼层 |阅读模式
1.gcc -shared -nostartfiles -Xlinker -Bsymbolic \
           -o libXX.so $libobjects
上面是编译某个库libXX的语句
我man 了一下GCC看了这几个选项,但是没很清楚
请详细解释一下以下几个选项的意思
-nostartfiles
-Xlinker
-Bsymbolic
2.gcc -Xlinker --script=YY.script -o YY $(YYobjects) -ldl
上面是编译某文件YY的语句
请解释
--script=YY.script,是不是在执行YY文件的时候要先执行YY.script脚本啊?
-ldl是不是连接dl库,即dynamic loader动态装载库呢?
发表于 2003-6-27 09:53:49 | 显示全部楼层
-ldl 连libdl
发表于 2003-6-27 09:53:59 | 显示全部楼层
其它的我再看看先
 楼主| 发表于 2003-6-28 09:34:21 | 显示全部楼层
如果程序中使用了动态库函数,则编译的时候需用-ldl,以实现连接。
动态库函数定义在头文件dlfcn.h中
一般常用的函数有:
void *dlopen(char *file,int mode);
int dlclose(void *handle);
void *dlsym(void *handle,char *name);
char *dlerror(void);
发表于 2003-6-28 09:52:09 | 显示全部楼层
自己不用 dlopen() 的时候,就不用 -ldl 了。
至于动态库的话,如果连接器能发现有动态版本存在的时候,缺省会连接到动态库的。比如如果有 libmylib.a 和 libmylib.so 都存在的时候,就会连接到 libmylib.so 的。
 楼主| 发表于 2003-6-28 17:49:49 | 显示全部楼层
-nostartfiles
Do not use the standard system startup files when linking. The standard syst
em libraries are used normally, unless -nostdlib or -nodefaultlibs is used.
就是说联接的时候不使用标准的启动文件。cc编译源程序为“.o”文件的时候,加一
个“-nostartfiles”选项。这个选项使得C编译器不链接系统的启动函数库里面
的启动函数。否则,就会得到一个“multiple-definition”的错误。
应该是在作函数库的时候用,还有?


-Xlinker
-Xlinker是连接时的选项,传送参数给连接器。本例就是-Bsymbolic

-Bsymbolic
连接器选项‘-Bsymbolic’,它导致在库本身内部的引用被解释好。否则,
在这些系统上,所有符号的解释将推迟到最后连接时再进行.

现在不明白的是请问系统的启动函数是干什么的?要不连接的话,是不是被编译的的库里有这种功能?
发表于 2003-6-28 19:11:50 | 显示全部楼层
对于系统的启动函数,我的理解是一个二进制代码在装入内存执行需要启动函数来做一些进程的初始化工作。由于一个进程只需要初始化一次,因此库文件不能有初始化的部分。在ELF格式文件中有一个.init段,就是做这个的。

  1. 在ELF系统上,一个程序是由可执行文件或者还加上一些共享object文件组成。
  2. 为了执行这样的程序,系统使用那些文件创建进程的内存映象。进程映象
  3. 有一些段(segment),包含了可执行指令,数据,等等。为了使一个ELF文件
  4. 装载到内存,必须有一个program header(该program header是一个描述段
  5. 信息的结构数组和一些为程序运行准备的信息)。

  6. 一个段可能有多个section组成.这些section在程序员角度来看更显的重要。
  7. 。。。
  8. .init
  9. 该section保存着可执行指令,它构成了进程的初始化代码。
  10. 因此,当一个程序开始运行时,在main函数被调用之前(c语言称为
  11. main),系统安排执行这个section的中的代码。

  12. .init和.fini sections的存在有着特别的目的。假如一个函数放到
  13. .init section,在main函数执行前系统就会执行它。同理,假如一
  14. 个函数放到.fini section,在main函数返回后该函数就会执行。
  15. 该特性被C++编译器使用,完成全局的构造和析构函数功能。

  16. 当ELF可执行文件被执行,系统将在把控制权交给可执行文件前装载所以相关
  17. 的共享object文件。构造正确的.init和.fini sections,构造函数和析构函数
  18. 将以正确的次序被调用。
复制代码

原文在这里:
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=48381
 楼主| 发表于 2003-6-28 19:16:46 | 显示全部楼层
你分析的很正确,谢谢!
发表于 2003-7-1 23:38:08 | 显示全部楼层
补充一点:启动模块中包含了程序的初始化例程。该初始化例程建立堆栈,并初始化程序中的某些变量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表