把选项传给连接器
优质
小牛编辑
133浏览
2023-12-01
例子
#include <stdio.h>
int main (void)
{
puts ("Hello world!");
return 0;
}
技巧
使用-Wl,option
可以将选项option
传递给连接器。
注意,逗号和选项之间不能有空格。一种常见用法,就是让连接器生成内存映射文件,例如:
$ gcc -Wl,-Map=output.map foo.c
$ cat output.map
Archive member included because of file (symbol)
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o (__libc_csu_init)
Discarded input sections
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
.gnu_debuglink
0x0000000000000000 0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
.gnu_debuglink
0x0000000000000000 0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.note.GNU-stack
0x0000000000000000 0x0 /tmp/ccBOhdmq.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.gnu_debuglink
0x0000000000000000 0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
Memory map
** file header
0x0000000000400000 0x40
** segment headers
0x0000000000400040 0x1f8
.interp 0x0000000000400238 0x1c
** fill 0x0000000000400238 0x1c
.note.ABI-tag 0x0000000000400254 0x20
.note.ABI-tag 0x0000000000400254 0x20 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
.note.gnu.build-id
0x0000000000400274 0x24
** note header
0x0000000000400274 0x10
** zero fill 0x0000000000400284 0x14
.dynsym 0x0000000000400298 0x78
** dynsym 0x0000000000400298 0x78
.dynstr 0x0000000000400310 0x51
** string table
0x0000000000400310 0x51
.gnu.hash 0x0000000000400368 0x1c
** hash 0x0000000000400368 0x1c
.gnu.version 0x0000000000400384 0xa
** versions 0x0000000000400384 0xa
.gnu.version_r 0x0000000000400390 0x20
** version refs
0x0000000000400390 0x20
.rela.dyn 0x00000000004003b0 0x18
** dynamic relocs
0x00000000004003b0 0x18
.rela.plt 0x00000000004003c8 0x30
** dynamic relocs
0x00000000004003c8 0x30
.init 0x00000000004003f8 0x18
.init 0x00000000004003f8 0x9 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
0x00000000004003f8 _init
.init 0x0000000000400401 0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.init 0x0000000000400406 0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.init 0x000000000040040b 0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.plt 0x0000000000400410 0x30
** PLT 0x0000000000400410 0x30
.text 0x0000000000400440 0x1d8
.text 0x0000000000400440 0x2c /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
0x0000000000400440 _start
.text 0x000000000040046c 0x17 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
** fill 0x0000000000400483 0xd
.text 0x0000000000400490 0x92 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.text 0x0000000000400522 0x15 /tmp/ccBOhdmq.o
0x0000000000400522 main
** fill 0x0000000000400537 0x9
.text 0x0000000000400540 0x92 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
0x0000000000400540 __libc_csu_init
0x00000000004005d0 __libc_csu_fini
** fill 0x00000000004005d2 0xe
.text 0x00000000004005e0 0x36 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
** fill 0x0000000000400616 0x2
.text 0x0000000000400618 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.fini 0x0000000000400618 0xe
.fini 0x0000000000400618 0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
0x0000000000400618 _fini
.fini 0x000000000040061c 0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.fini 0x0000000000400621 0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.rodata 0x0000000000400628 0x11
** merge constants
0x0000000000400628 0x4
.rodata 0x000000000040062c 0xd /tmp/ccBOhdmq.o
.eh_frame 0x0000000000400640 0xa4
** eh_frame 0x0000000000400640 0xa0
.eh_frame 0x00000000004006e0 0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.eh_frame_hdr 0x00000000004006e4 0x2c
** eh_frame_hdr
0x00000000004006e4 0x2c
.ctors 0x0000000000401e28 0x10
.ctors 0x0000000000401e28 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.ctors 0x0000000000401e30 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.dtors 0x0000000000401e38 0x10
.dtors 0x0000000000401e38 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.dtors 0x0000000000401e40 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
0x0000000000401e40 __DTOR_END__
.jcr 0x0000000000401e48 0x8
.jcr 0x0000000000401e48 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.jcr 0x0000000000401e48 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.dynamic 0x0000000000401e50 0x190
** dynamic 0x0000000000401e50 0x190
.got 0x0000000000401fe0 0x8
** GOT 0x0000000000401fe0 0x8
.got.plt 0x0000000000401fe8 0x28
** GOT PLT 0x0000000000401fe8 0x28
** GOT IRELATIVE PLT
0x0000000000402010 0x0
** GOT 0x0000000000402010 0x0
.data 0x0000000000402010 0x10
.data 0x0000000000402010 0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
0x0000000000402010 data_start
0x0000000000402010 __data_start
.data 0x0000000000402014 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
.data 0x0000000000402018 0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
0x0000000000402018 __dso_handle
.data 0x0000000000402020 0x0 /tmp/ccBOhdmq.o
.data 0x0000000000402020 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.data 0x0000000000402020 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.data 0x0000000000402020 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.bss 0x0000000000402020 0x10
.bss 0x0000000000402020 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
.bss 0x0000000000402020 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
.bss 0x0000000000402020 0x10 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
.bss 0x0000000000402030 0x0 /tmp/ccBOhdmq.o
.bss 0x0000000000402030 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.bss 0x0000000000402030 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
.bss 0x0000000000402030 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
.comment 0x0000000000000000 0x2b
** merge strings
0x0000000000000000 0x2b
.note.gnu.gold-version
0x0000000000000000 0x1c
** note header
0x0000000000000000 0x10
** fill 0x0000000000000010 0x9
** zero fill 0x0000000000000019 0x3
.symtab 0x0000000000000000 0x390
** symtab 0x0000000000000000 0x390
.strtab 0x0000000000000000 0x1d5
** string table
0x0000000000000000 0x1d5
.shstrtab 0x0000000000000000 0x115
** string table
0x0000000000000000 0x115
详情参见 gcc手册