[PATCH] D41635: Align SHT_NOBITS sections is they are the first on a PT_LOAD
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 30 12:07:15 PST 2017
I guess we could avoid that warning by aligning the NOBITS section but
then ignoring the alignment when computing the offset of followup
sections. It is not clear which one is stranger.
In any case, I would like to fix just the BSD objcopy issue on this
patch since it is a real problem.
Cheers,
Rafael
Dimitry Andric via Phabricator <reviews at reviews.llvm.org> writes:
> dim added a comment.
>
> It looks like GNU bfd/elf.c looks at the MemSiz field in the program header, then adds that to PhysAddr to get the end address of the segment (see line 5541 in bfd/elf.c <https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=bfd/elf.c;h=fa70a949751767a71c3e794b5b5dece0bbc0f3fb;hb=HEAD#l5541>). In case of `.init_array`, `.fini_array`, `.data.rel.ro` and `.preinit_array`, the load address is before the end of the address, and that causes it to complain:
>
> $ readelf -lSW /usr/obj/share/dim/src/freebsd/clang600-import/amd64.amd64/sys/GENERIC/kernel.full
> There are 68 section headers, starting at offset 0x642dc08:
>
> Section Headers:
> [Nr] Name Type Address Off Size ES Flg Lk Inf Al
> [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
> [ 1] .interp PROGBITS ffffffff80200270 000270 00000d 00 A 0 0 1
> [ 2] .hash HASH ffffffff80200280 000280 029088 04 A 4 0 4
> [ 3] .gnu.hash GNU_HASH ffffffff80229308 029308 021a44 00 A 4 0 8
> [ 4] .dynsym DYNSYM ffffffff8024ad50 04ad50 07b180 18 A 5 1 8
> [ 5] .dynstr STRTAB ffffffff802c5ed0 0c5ed0 065c45 00 A 0 0 1
> [ 6] .text PROGBITS ffffffff8032c000 12c000 d8a544 00 AX 0 0 4096
> [ 7] .rodata PROGBITS ffffffff810b6560 eb6560 6430c0 00 AMS 0 0 32
> [ 8] .eh_frame PROGBITS ffffffff816f9620 14f9620 028198 00 A 0 0 8
> [ 9] set_sysctl_set PROGBITS ffffffff817217b8 15217b8 0047f8 00 A 0 0 8
> [10] set_sysinit_set PROGBITS ffffffff81725fb0 1525fb0 003340 00 A 0 0 8
> [11] set_sysuninit_set PROGBITS ffffffff817292f0 15292f0 001840 00 A 0 0 8
> [12] set_modmetadata_set PROGBITS ffffffff8172ab30 152ab30 003210 00 A 0 0 8
> [13] set_cam_xpt_xport_set PROGBITS ffffffff8172dd40 152dd40 000058 00 A 0 0 8
> [14] set_cam_xpt_proto_set PROGBITS ffffffff8172dd98 152dd98 000028 00 A 0 0 8
> [15] set_kdb_dbbe_set PROGBITS ffffffff8172ddc0 152ddc0 000018 00 A 0 0 8
> [16] set_ah_chips PROGBITS ffffffff8172ddd8 152ddd8 000048 00 A 0 0 8
> [17] set_ah_rfs PROGBITS ffffffff8172de20 152de20 000050 00 A 0 0 8
> [18] set_kbddriver_set PROGBITS ffffffff8172de70 152de70 000020 00 A 0 0 8
> [19] set_sdt_providers_set PROGBITS ffffffff8172de90 152de90 0000a8 00 A 0 0 8
> [20] set_sdt_probes_set PROGBITS ffffffff8172df38 152df38 0010c0 00 A 0 0 8
> [21] set_sdt_argtypes_set PROGBITS ffffffff8172eff8 152eff8 003348 00 A 0 0 8
> [22] set_cons_set PROGBITS ffffffff81732340 1532340 000030 00 A 0 0 8
> [23] set_gdb_dbgport_set PROGBITS ffffffff81732370 1532370 000010 00 A 0 0 8
> [24] usb_host_id PROGBITS ffffffff81732380 1532380 000040 00 A 0 0 32
> [25] set_vt_drv_set PROGBITS ffffffff817323c0 15323c0 000018 00 A 0 0 8
> [28] set_ieee80211_ioctl_getset PROGBITS ffffffff81732400 1532400 000018 00 A 0 0 8
> [29] set_ieee80211_ioctl_setset PROGBITS ffffffff81732418 1532418 000018 00 A 0 0 8
> [30] set_scanner_set PROGBITS ffffffff81732430 1532430 000028 00 A 0 0 8
> [31] set_videodriver_set PROGBITS ffffffff81732458 1532458 000020 00 A 0 0 8
> [32] set_scterm_set PROGBITS ffffffff81732478 1532478 000008 00 A 0 0 8
> [33] set_scrndr_set PROGBITS ffffffff81732480 1532480 000048 00 A 0 0 8
> [34] set_vga_set PROGBITS ffffffff817324c8 15324c8 000048 00 A 0 0 8
> [35] kern_conf PROGBITS ffffffff81732510 1532510 001025 00 A 0 0 16
> [36] .note.gnu.build-id NOTE ffffffff81733538 1533538 000024 00 A 0 0 4
> [37] .preinit_array NOBITS ffffffff81734000 153355c 000000 00 A 0 0 1
> [38] .init_array NOBITS ffffffff81734000 153355c 000000 00 A 0 0 1
> [39] .fini_array NOBITS ffffffff81734000 153355c 000000 00 A 0 0 1
> [40] .data.rel.ro NOBITS ffffffff81734000 1534000 000000 00 WA 0 0 1
> [41] .dynamic DYNAMIC ffffffff81734000 1534000 0000f0 10 WA 5 0 8
> [42] .data.read_frequently PROGBITS ffffffff81735000 1535000 000048 00 WA 0 0 8
> [43] .data.read_mostly PROGBITS ffffffff81735048 1535048 000129 00 WA 0 0 8
> [44] .data.exclusive_cache_line PROGBITS ffffffff81735180 1535180 006bc0 00 WA 0 0 64
> [45] .data PROGBITS ffffffff8173bd40 153bd40 140ccc 00 WA 0 0 64
> [46] set_pcpu PROGBITS ffffffff8187ca40 167ca40 001038 00 WA 0 0 64
> [47] set_vnet PROGBITS ffffffff8187da80 167da80 008948 00 WA 0 0 16
> [48] .bss NOBITS ffffffff81886400 16863c8 52a518 00 WA 0 0 128
> [49] .ldata NOBITS ffffffff81db1918 16863c8 000000 00 WA 0 0 1
> [50] .comment PROGBITS 0000000000000000 16863c8 0230d7 00 MS 0 0 1
> [51] .debug_aranges PROGBITS 0000000000000000 16a949f 0001b0 00 0 0 1
> [52] .debug_pubnames PROGBITS 0000000000000000 16a964f 225c4b 00 0 0 1
> [53] .debug_info PROGBITS 0000000000000000 18cf29a 244c8f5 00 0 0 1
> [54] .debug_abbrev PROGBITS 0000000000000000 3d1bb8f 126540 00 0 0 1
> [55] .debug_line PROGBITS 0000000000000000 3e420cf 74acb5 00 0 0 1
> [56] .debug_frame PROGBITS 0000000000000000 458cd88 139760 00 0 0 8
> [57] .debug_str PROGBITS 0000000000000000 46c64e8 2d7d40 01 MS 0 0 1
> [58] .debug_loc PROGBITS 0000000000000000 499e228 106ed53 00 0 0 1
> [59] .debug_macinfo PROGBITS 0000000000000000 5a0cf7b 000754 00 0 0 1
> [60] .debug_pubtypes PROGBITS 0000000000000000 5a0d6cf 4e9610 00 0 0 1
> [61] .debug_ranges PROGBITS 0000000000000000 5ef6cdf 1708a0 00 0 0 1
> [62] __xen_guest PROGBITS 0000000000000000 606757f 000000 00 0 0 1
> [63] .note.Xen NOTE 0000000000000000 6067580 0001a0 00 0 0 4
> [64] .shstrtab STRTAB 0000000000000000 61d54e0 00039d 00 0 0 1
> [65] .SUNW_ctf PROGBITS 0000000000000000 6360fcc 0ccc37 00 66 0 4
> [66] .symtab SYMTAB 0000000000000000 6067720 16ddc0 18 67 41433 8
> [67] .strtab STRTAB 0000000000000000 61d587d 18b74c 00 0 0 1
> Key to Flags:
> W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
> L (link order), O (extra OS processing required), G (group), T (TLS),
> C (compressed), x (unknown), o (OS specific), E (exclude),
> l (large), p (processor specific)
>
> Elf file type is EXEC (Executable file)
> Entry point 0xffffffff8032c000
> There are 10 program headers, starting at offset 64
>
> Program Headers:
> Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
> PHDR 0x000040 0xffffffff80200040 0xffffffff80200040 0x000230 0x000230 R 0x8
> INTERP 0x000270 0xffffffff80200270 0x0000000000200270 0x00000d 0x00000d R 0x1
> [Requesting program interpreter: /red/herring]
> LOAD 0x000000 0xffffffff80200000 0xffffffff80200000 0x000270 0x000270 R E 0x1000
> LOAD 0x000270 0xffffffff80200270 0x0000000000200270 0x15332ec 0x1533d90 R E 0x1000
> LOAD 0x1534000 0xffffffff81734000 0x0000000001734000 0x1523c8 0x67d918 RW 0x1000
> DYNAMIC 0x1534000 0xffffffff81734000 0x0000000001734000 0x0000f0 0x0000f0 RW 0x8
> GNU_RELRO 0x1534000 0xffffffff81734000 0x0000000001734000 0x0000f0 0x0000f0 R 0x1
> GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
> NOTE 0x1533538 0xffffffff81733538 0x0000000001733538 0x000024 0x000024 R 0x4
> NOTE 0x85400f8 0x0000000000000000 0x0000000080000000 0x000000 0x000000 R 0x4
>
> Section to Segment mapping:
> Segment Sections...
> 00
> 01 .interp
> 02
> 03 .interp .hash .gnu.hash .dynsym .dynstr .text .rodata .eh_frame set_sysctl_set set_sysinit_set set_sysuninit_set set_modmetadata_set set_cam_xpt_xport_set set_cam_xpt_proto_set set_kdb_dbbe_s
> et set_ah_chips set_ah_rfs set_kbddriver_set set_sdt_providers_set set_sdt_probes_set set_sdt_argtypes_set set_cons_set set_gdb_dbgport_set usb_host_id set_vt_drv_set set_ratectl_set set_crypto_set set
> _ieee80211_ioctl_getset set_ieee80211_ioctl_setset set_scanner_set set_videodriver_set set_scterm_set set_scrndr_set set_vga_set kern_conf .note.gnu.build-id
> 04 .preinit_array .init_array .fini_array .data.rel.ro .dynamic .data.read_frequently .data.read_mostly .data.exclusive_cache_line .data set_pcpu set_vnet .bss
> 05 .dynamic
> 06 .preinit_array .init_array .fini_array .data.rel.ro .dynamic
> 07
> 08 .note.gnu.build-id
> 09
>
> Here ` .preinit_array .init_array .fini_array .data.rel.ro .dynamic` are both in the `LOAD` and `GNU_RELRO` segments, but in the relro one its MemSiz is 0xf0, which is exactly the amount that BFD objcopy is adjusting it with.
>
>
> https://reviews.llvm.org/D41635
More information about the llvm-commits
mailing list