[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