[PATCH] D38625: [ELF] - Ignore non-absolute R_386_GOTPC relocation in debug sections.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 20 09:44:38 PDT 2017


LGTM

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar updated this revision to Diff 119637.
> grimar edited the summary of this revision.
> grimar added a comment.
>
> - Addressed review comments, updated comment.
>
>
> https://reviews.llvm.org/D38625
>
> Files:
>   ELF/InputSection.cpp
>   test/ELF/i386-debug-noabs.test
>
>
> Index: test/ELF/i386-debug-noabs.test
> ===================================================================
> --- test/ELF/i386-debug-noabs.test
> +++ test/ELF/i386-debug-noabs.test
> @@ -0,0 +1,33 @@
> +# REQUIRES: x86
> +
> +# RUN: yaml2obj %s -o %t.o
> +# RUN: ld.lld %t.o -o %t.exe
> +
> +## It is for PR34852 (https://bugs.llvm.org//show_bug.cgi?id=34852)
> +## gcc-5.4 has a bug which creates non-absolute R_386_GOTPC relocation
> +## against _GLOBAL_OFFSET_TABLE_ when producing objects for i386 target.
> +## Here we check that LLD is able to use such objects.
> +
> +--- !ELF
> +FileHeader:      
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_386
> +Sections:        
> +  - Name:            .debug_info
> +    Type:            SHT_PROGBITS
> +    AddressAlign:    0x0000000000000001
> +    Content:         0000000000000000
> +  - Name:            .rel.debug_info
> +    Type:            SHT_REL
> +    Link:            .symtab
> +    AddressAlign:    0x0000000000000004
> +    Info:            .debug_info
> +    Relocations:     
> +      - Offset:          0x000000000000041F
> +        Symbol:          _GLOBAL_OFFSET_TABLE_
> +        Type:            R_386_GOTPC
> +Symbols:
> +  Global:
> +    - Name:            _GLOBAL_OFFSET_TABLE_
> Index: ELF/InputSection.cpp
> ===================================================================
> --- ELF/InputSection.cpp
> +++ ELF/InputSection.cpp
> @@ -666,6 +666,14 @@
>      if (Expr == R_NONE)
>        continue;
>      if (Expr != R_ABS) {
> +      // At the moment of 20 october 2017, gcc has a bug which creates
> +      // R_386_GOTPC relocation against _GLOBAL_OFFSET_TABLE_ in .debug_info.
> +      // We ignore such relocation. All gcc versions seem to be affected.
> +      // TODO: remove this hack once issue is fixed and we stop supporting
> +      //       gcc versions affected.
> +      if (Config->EMachine == EM_386 && Expr == R_GOTONLY_PC_FROM_END)
> +        continue;
> +
>        error(this->getLocation<ELFT>(Offset) + ": has non-ABS relocation " +
>              toString(Type) + " against symbol '" + toString(Sym) + "'");
>        return;
>
>
> Index: test/ELF/i386-debug-noabs.test
> ===================================================================
> --- test/ELF/i386-debug-noabs.test
> +++ test/ELF/i386-debug-noabs.test
> @@ -0,0 +1,33 @@
> +# REQUIRES: x86
> +
> +# RUN: yaml2obj %s -o %t.o
> +# RUN: ld.lld %t.o -o %t.exe
> +
> +## It is for PR34852 (https://bugs.llvm.org//show_bug.cgi?id=34852)
> +## gcc-5.4 has a bug which creates non-absolute R_386_GOTPC relocation
> +## against _GLOBAL_OFFSET_TABLE_ when producing objects for i386 target.
> +## Here we check that LLD is able to use such objects.
> +
> +--- !ELF
> +FileHeader:      
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_386
> +Sections:        
> +  - Name:            .debug_info
> +    Type:            SHT_PROGBITS
> +    AddressAlign:    0x0000000000000001
> +    Content:         0000000000000000
> +  - Name:            .rel.debug_info
> +    Type:            SHT_REL
> +    Link:            .symtab
> +    AddressAlign:    0x0000000000000004
> +    Info:            .debug_info
> +    Relocations:     
> +      - Offset:          0x000000000000041F
> +        Symbol:          _GLOBAL_OFFSET_TABLE_
> +        Type:            R_386_GOTPC
> +Symbols:
> +  Global:
> +    - Name:            _GLOBAL_OFFSET_TABLE_
> Index: ELF/InputSection.cpp
> ===================================================================
> --- ELF/InputSection.cpp
> +++ ELF/InputSection.cpp
> @@ -666,6 +666,14 @@
>      if (Expr == R_NONE)
>        continue;
>      if (Expr != R_ABS) {
> +      // At the moment of 20 october 2017, gcc has a bug which creates
> +      // R_386_GOTPC relocation against _GLOBAL_OFFSET_TABLE_ in .debug_info.
> +      // We ignore such relocation. All gcc versions seem to be affected.
> +      // TODO: remove this hack once issue is fixed and we stop supporting
> +      //       gcc versions affected.
> +      if (Config->EMachine == EM_386 && Expr == R_GOTONLY_PC_FROM_END)
> +        continue;
> +
>        error(this->getLocation<ELFT>(Offset) + ": has non-ABS relocation " +
>              toString(Type) + " against symbol '" + toString(Sym) + "'");
>        return;


More information about the llvm-commits mailing list