`--traditional-format'
对于某些目标平台, 'ld'的输出会跟某些面有的连接器的输出有所不同. 这个开关要求'ld'使用传 统的格式.
比如, 在SunOS上, 'ld'会把符号串表中的两上完全相同的入口合并起来. 这可以把一个带有调试信息
的输出文件的大小减小百发之三十. 不幸地是, SunOS的'dbx'程序不能读取这个输出的程序(gdb就没
有问题).'--trafitinal-format'开关告诉'ld'不要把相同的入口合并起来. `--section-start SECTIONNAME=ORG'
通过指定ORG, 指定节在输出文件中的绝对地址. 你可以多次使用这个选项来定位多个节. ORG必须是
一个十六进制整数; 为了跟基他的连接器兼容,你可以忽略前导'0x'. 注意,在SECTIONNAME,等号,ORG 之间不允许有空格出现.
`-Tbss ORG' `-Tdata ORG' `-Ttext ORG'
跟-section-start同义, 不过把SECTIONNAME替换为'.bss', '.data'或'.text'.
`--dll-verbose' `--verbose'
显示'ld'的版本号,并列出支持的连接器模拟. 显示哪些输入文件能被打开,而哪些不能. 显示连接器 使用的连接脚本.
`--version-script=VERSION-SCRIPTFILE'
指定连接器的脚本的版本名. 这个常在创建一个需要指定附加的关于版本层次的信息的共享库时使用,
这个选项只有支持共享库的ELF平台上有效.
`--warn-common'
当一个普通符号跟另一个普通符号或会号定义合并起来时,警告. 类Unix连接器允许这个选项,有时比
较实用, 但是在其他的操作系统上的连接器不允许这个. 这个选项可以让你在合并全局符号时发现某
些潜在的问题. 不幸的是,有些C库使用这项特性,所以你可能会像在你的程序中一样,在库中得到一些 警告信息.
这里给出三种类型的全局符号的解释(用C语言):
`int i = 1;'
一个定义, 它会存在于输出文件中的已初始化数据节.
`extern int i;'
一个未定义符号,它不占用空间. 必须在另外某一处对它有一个定义,或一个普通符号
`int i;'
一个普通符号.如果对于一个变量只有(一个或多个)普通符号, 它进入输出文件的未初始化数据域. 连
接器会把同一变量的多个普通符号合并成一个单一的符号. 如果他们有不同的大小, 它采用最大的一
个. 如果是对同一变量的定义,连接器把一个普通符号转化为一个声明.
'--warn-common'选项可以产生五种类型的警告. 每种警告由两行组成: 第一行描述遇到的符号, 第二
行描述遇到的前一个具有相同名字的符号. 一个或两个都可能成为普通符号. 1. 把一个普通符号转化为一个引用, 因为这个符号已经有一个定义了. FILE(SECTION): warning: common of `SYMBOL' overridden by definition
FILE(SECTION): warning: defined here
2. 把一个普通符号转化为一个引用,因为遇到了第二个关于符号的定义. 这跟前一种情况相同,除了符 号遇到的顺序相反.
FILE(SECTION): warning: definition of `SYMBOL' overriding common
FILE(SECTION): warning: common is here
3. 把一个普通符号跟前一个相同大小的普通符号合并. FILE(SECTION): warning: multiple common of `SYMBOL'
FILE(SECTION): warning: previous common is here 4. 把一个普通符号跟前一个更大的普通符号合并.
FILE(SECTION): warning: common of `SYMBOL' overridden by larger common
FILE(SECTION): warning: larger common is here
5. 把一个普通符号跟前一个更小的普通符号合并. 这跟前一种情况相同, 除了遇到的符号的顺序不同.
FILE(SECTION): warning: common of `SYMBOL' overriding smaller common
FILE(SECTION): warning: smaller common is here
`--warn-constructors'
如果有全局结构体被使用到了,警告. 这只对很少的一些目标文件格式有用. 对于COFF或ELF格式, 连
接器不同探测到全局结构体的使用.
`--warn-multiple-gp'
如果在输出文件中,需要多个全局指针值,警告. 这只对特定的处理器有意义, 比如Alpha. 特别的,有
些处理器在特定的节中放入很大的常数值. 一个特殊的寄存器(全局指针)指向这个节的中间部分, 所
以通过一个基地址寄存器相关的地址模式,这个常数可以很容易地被载入. 因为这个基寄存器相关模式
的偏移值是固定的而且很小(比如,16位), 这会限制常量池的最大尺寸. 所以,一个很大的问题是,为了
能够定位所有可能的常数,经常需要使用多个全局指针值. 这个选项在这种情况发生时产生一条警告.
`--warn-once'
对于每一个未定义符号只警告一次, 而不是在每一个用到它的模块中警告一次. `--warn-section-align'
如果输出节的地址因为对齐被改变了,警告. 通常, 对齐会被输入节设置. 如果'SECTION'命令没有指
定节的起始地址, 地址就会被隐式改变.
`--whole-archive'
对于每一个在命令行中'--whole-archive'选项后面出现的档案文件, 在连接中包含档案文件中的所有
目标文件, 而不是为需要的目标文件搜索档案文件. 这在把一个档案文件转化为一个共享库时使用, 把
所有的目标放到最终的共享库中. 这个选项可以被多次使用.
在GCC中使用这个选项需要注意两点: 首先,GCC不知道这个选项, 所以,你必须使用'-Wl, -whole-archive'.
第二, 不要忘了在你的档案文件列表的后面使用'-Wl, -no-whole-archive',因为GCC会把它自己的档
案列表加到你的连接后面, 而这可能并不是你所预期的.
`--wrap SYMBOL'
对SYMBOL符号使用包装函数. 任何未定义的对SYMBOL符号的引用会被解析成'_wrap_SYMBOL'. 而任何
未定义的对'_real_SYMBOL'的引用会被解析成SYMBOL.
这可以用来为系统函灵敏提供一个包装. 包装函灵敏应当被叫做'__wrap_SYMBOL'. 如果需要调用这个
函数, 那就应该调用'__real_SYMBOL' 这里是一个没什么实用价值的例子:
void *
__wrap_malloc (int c) {
printf (\ return __real_malloc (c); }
如果你使用'--wrap malloc'把这节代码跟其他的代码连接, 那所有的对'malloc'的调用都会调用
'__wrap_malloc'函数. 而在'__wrap_malloc'中的'__real_malloc'会调用真正的'malloc'函数.
你有可能也希望提供一个'__real_malloc'函数, 这样,不带有'--wrap'的连接器也会成功连接.如果
你这样做了, 你不能把'__real_malloc'的定义跟'__wrap_malloc'放到同一个文件中;如果放在一起
汇编器会在连接器之前把调用解析成真正的'malloc'.
`--enable-new-dtags' `--disable-new-dtags'
连接器可以在ELF中创建一个新的动态标签. 但是旧的ELF系统可能不理解这个. 如果你指定了
'--enable-new-dtags',动态标签会按需要被创建. 如果你指定了'--disable-new-dtags',那不会有
新的动态标签被创建. 缺省地,新的动态标签不会被创建. 注意这些选项只在ELF系统中有效.
i386 PE平台的特定选项.
-----------------------------------
i386 PE连接器支持'-shared'选项, 它使输出文件为一个动态链接库(DLL),而不是一个普通的可执行文件. 在
使用这个选项的时候,你应当为输出文件取名'*.dll',另外, 连接器完全支持标准的'*.def'文件, 这类文件可
以在连接器命令行上象一个目标文件一样被指定(实际上, 它应当被放在它从中导出符号的那个档案文件前面,
以保证它们象一个普通的目标文件一样被连接进去.)
除了对所有平台通用的那些选项外,i386 PE连接器支持一些只对i386平台专有的命令行选面. 带有值的选项应 当用空格或等号把它跟值分隔开.
`--add-stdcall-alias'
如果给出这个选项, 带有标准调用后缀(@NN)的符号会被剥掉后缀后导出. `--base-file FILE'
使用FILE作为文件名,该文件是存放用'dlltool'产生 DLL文件时所需的所有重定位符的基地址的.(这
个选面是i386 PE平台所专有的]
`--dll'
创建一个DLL文件而不是一个常规可执行文件. 你可能在一个给出的'.def'文件中使用'-shared'或指 定'LIBRARY'.
`--enable-stdcall-fixup' `--disable-stdcall-fixup'
如果连接器发现有符号不能解析, 它会试图进行'失真连接',即寻找另一个定义的符号,它们只是在
符号名的格式上不同(cdecl vs stdcall),并把符号解析为找到的这个符号. 比如, 一个未定义的符
号'_foo'可能被连接到函数'_foo@12', 或者一个未定义的符号'_bar@16'可能被连接到函数'_bar'.
如果连接器这么做了, 它会打印出一条警告信息, 因为在正常情况下,这会连接失败, 但有时,由第三
方库产生的导入库可能需要这个特性. 如果你指定了'--enable-stdcall-fixup', 这个特性会被完全
开启,警告信息也不会打印出来. 如果你指定了'--disable-stdcall-fixup',这个特性被关闭,而且这
样的错误匹配会被认为是个错误.
`--export-all-symbols'
如果给出这个选项,目标中所有由DLL建立的全局符号会被DLL导出. 注意这是缺省情况,否则没有任何
符号被导出. 如果符号由DEF文件显式地导出,或由函数本身的属性隐式地导出, 缺省情况是除非选项
给出,否则不导出任何其他的符号. 注意符号`DllMain@12',`DllEntryPoint@0',
`DllMainCRTStartup@12'和`impure_ptr'不会自动被导出.而且,由其他的DLL导入的符号也不会被再
次导出, 还有指定DLL内部布局的符号,比如那些以'_head_'开头,或者以'_iname'结尾的符号也不会
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库ld中文使用手册完全版(4)在线全文阅读。
相关推荐: