[llvm-bugs] [Bug 43457] New: attributes that force symbols into named sections can create broken ELF output

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Sep 25 19:30:53 PDT 2019


            Bug ID: 43457
           Summary: attributes that force symbols into named sections can
                    create broken ELF output
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: MC
          Assignee: unassignedbugs at nondot.org
          Reporter: bd1976llvm at gmail.com
                CC: llvm-bugs at lists.llvm.org

Attributes that force the compiler to place symbols into the same section can
create broken ELF output if those symbols are incompatible.

Consider the following test case:

@foo = unnamed_addr constant [4 x i32] [i32 1, i32 0, i32 0, i32 1], align 16

@bar = unnamed_addr constant [9 x i64] [i64 0, i64 0, i64 0, i64 0, i64 0, i64
0, i64 0, i64 0, i64 1], align 16 "rodata-section"=".explicit" 

which if run through llc results in:

        .type   foo, at object             # @foo
        .section        .explicit,"aM", at progbits,16
        .globl  foo
        .p2align        4
        .long   1                       # 0x1
        .long   0                       # 0x0
        .long   0                       # 0x0
        .long   1                       # 0x1
        .size   foo, 16

        .type   bar, at object             # @bar
        .globl  bar
        .p2align        4
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   0                       # 0x0
        .quad   1                       # 0x1
        .size   bar, 72

The entsize of the resulting .explicit section is less than the size of symbol
bar. This is an incorrect ELF as the linker can merge entsize pieces of this
section at link time which will result in incorrect output, given this input.

In this case the compiler has created an incorrect SHF_MERGE section as two
constant symbols with different sizes were placed in the same section and, at
the time of writing, the created section derives its properties from the first
symbol to be placed in the section - which is why the entsize for the .explicit
section is 16.

GCC does not produce a mergable section for this test case.

In terms of clang source code:

#pragma clang section ... -


_attribute_ ((section ("section-name"))) -

map to IR attributes that can cause this bug.

Ideas for a fix:

- Allow these attributes to create multiple sections, each with the same name,
rather than a single section. This can be done by checking if the section
properties required for a given symbol are incompatible with any existing
section of the same name and creating a new section if they are.

- Try to create sections that can safely have different kinds of symbols placed
into them. Error if symbols are truly incompatible.

For the specific case of SHF_MERGE sections a simple fix is to not put symbols
into SHF_MERGE sections if they have been explicitly assigned to a section.
This misses out on the SHF_MERGE optimizations in the linker - but only for
symbols that have been explicitly placed in a section (rare?). This change may
be worth making first before tackling the larger problem.

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20190926/9490c345/attachment.html>

More information about the llvm-bugs mailing list