本文罗列一些我现在理解的命令行参数。
-e entry, --entry=entry
使用entry符号,作为开始程序执行的入口,而不是缺省的入口点。如果没有entry符号,则链接器将其当做数字,作为入口地址。数字被翻译为10进制的;如果是0x开头,则被翻译为16进制的;如果是0开头,则是8进制。
-fini=name
创建可执行文件和共享文件时,设置DT_FINI为name指定的地址。缺省,链接器使用_fini。
-h name, -soname=name
创建共享目标文件时,指定DT_SONAME的值。
-init=name
创建可执行文件或者共享文件时,设置DT_INIT为name指定的地址,缺省,链接器使用_init。
-l namespace, --library=namespec
添加静态库或动态库,先搜索libnamespec.so的动态库,没有再搜索libnamespec.a的静态库。如果namespec是":filename"的形式,则直接搜索叫filename文件名的库。链接器只会搜索库一次,也就是说,如果库定义了一个符号,而目标文件在方面,不会往前搜索。所以通常被依赖者要放在后面。可以指定同一个库多次。
-L searchdir, --library-path=searchdir
指定库的搜索路径。如果使用-T指定了链接脚本,也指定了链接脚本的搜索路径。搜索路径是全局的,即使他们放在-l之后也同样生效。搜索的顺序,按照-L的顺序。
-o ouput, --output=output
指定输出文件的名字,如果没有指定为a.out。
-q, --emit-relocs
在完全链接的可执行文件中,保留可重定向section和内容。
-i, -r, --relocatable
产生可重定向目标文件。
-s, --strip-all
清掉输出文件的所有符号信息。
-T scriptfile, --script=scriptfile
指定链接器脚本,如果不在当前目录,则尝试搜索-L指定的目录。
-x, --discard-all
删除所有本地符号
-X, --discard-locals
删除所有本地临时符号,这些符号通常以系统定义的本地符号前缀开始,如.L
-( archives -), --start-group archives --end-group
archives是共享文件的列表,它们可以是显式的名字或者-l选项。这些文件将被搜索多次来解析未定义符号,通常只有循环依赖的时候才需要这种方式。
-Bdynmic, -dy, -call_shared
链接共享库,而不是静态库,影响后续的-l选项。
-Bstatic, -dn, -non_shared, -static
链接静态库,而不是共享库,影响后续的-l选项。
-Ifile, --dynamic-linker=file
指定动态链接器的名字。
--fatal-warnings, --no-fatal-warnings
是/否将所有的警告当做错误。影响之后的选项。
-M, --print-map, -Map=file
打印link map到stdout或者文件。
-nostdlib
只搜索命令行或者脚本指定的链接路径。
-pie, --pic-executable
创建位置独立可执行文件。
-rpath=dir
指定运行时库搜索路径。
-shared, -Bshareable
创建共享库。
--section-start=sectionname=org, -Tbss=org, -Tdata=org, -Ttext=org
定位section到绝对地址。org必须是16进制,可以省略前导0x。
-Ttext-segment=org, -Trodata-segment=org
设置text,rodata段的第一个字节到绝对地址。