[PATCH] D41635: Align SHT_NOBITS sections is they are the first on a PT_LOAD

Dimitry Andric via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 29 16:49:37 PST 2017


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