| Summary: | LLD Filesize and default option suggestions | ||
|---|---|---|---|
| Product: | Base System | Reporter: | pprocacci |
| Component: | bin | Assignee: | freebsd-toolchain (Nobody) <toolchain> |
| Status: | Open --- | ||
| Severity: | Affects Some People | CC: | dim, emacsray, emaste |
| Priority: | --- | Keywords: | needs-qa |
| Version: | 12.0-RELEASE | ||
| Hardware: | Any | ||
| OS: | Any | ||
|
Description
pprocacci
2019-05-01 03:44:51 UTC
As you note you can remove .comment with objcopy, I suspect the lld authors will feel the complexity of a --comment / --no-comment or similar flag is warranted. lld is inherently a cross-platform linker and intentionally has no built-in default target. Normally the format is identified from the first object file - if your ELF .o has an EI_OSABI of FreeBSD the output will as well. Would you compare readelf -lS porcupine and porcupine.lld? (In reply to Ed Maste from comment #1) The complexity is not warranted, rather. # readelf -lS porcupine
Elf file type is EXEC (Executable file)
Entry point 0x400080
There are 1 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flg Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000009c 0x000000000000009c R E 0x200000
Section to Segment mapping:
Segment Sections...
00 .text
There are 3 section headers, starting at offset 0xb0:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000400080 00000080
000000000000001c 0000000000000000 AX 0 0 16
[ 2] .shstrtab STRTAB 0000000000000000 0000009c
0000000000000011 0000000000000000 0 0 1
# readelf -lS porcupine.lld
Elf file type is EXEC (Executable file)
Entry point 0x201000
There are 4 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flg Align
PHDR 0x0000000000000040 0x0000000000200040 0x0000000000200040
0x00000000000000e0 0x00000000000000e0 R 0x8
LOAD 0x0000000000000000 0x0000000000200000 0x0000000000200000
0x0000000000000120 0x0000000000000120 R 0x1000
LOAD 0x0000000000001000 0x0000000000201000 0x0000000000201000
0x000000000000001c 0x000000000000001c R E 0x1000
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0
Section to Segment mapping:
Segment Sections...
00
01
02 .text
03
There are 3 section headers, starting at offset 0x1030:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000201000 00001000
000000000000001c 0000000000000000 AX 0 0 16
[ 2] .shstrtab STRTAB 0000000000000000 0000101c
0000000000000011 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
Use --strip-all if you don't want .symtab
Use --no-rosegment to merge R PT_LOAD and RE PT_LOAD
To discard PT_GNU_STACK and .comment, you have to use a linker script, e.g.
PHDRS { text PT_LOAD; }
SECTIONS { /DISCARD/ : {*(.comment)} .text : {*(.text)} :text }
(objcopy options can be combined, e.g. objcopy -S --remove-section=.comment porcupine.lld
|