This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR ld/13817: Broken IFUNC support


On Fri, Mar 9, 2012 at 8:32 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> We have to use real function, not PLT entry for non-GOT reference to
> locally defined IFUNC symbols, at least on i386, since the PLT slot
> assumes that %ebx of the caller points to the _GLOBAL_OFFSET_TABLE_
> symbol of the library containing the PLT slot. ?I checked in this
> patch to revert:
>
> http://sourceware.org/ml/binutils/2011-10/msg00203.html
>
> Although x86-64 doesn't have this problem. I reverted both i386 and
> x86-64 changes to keep i386 consistent with x86-64 as much as possible.


I will backport it to 2.22 branch.

>
> H.J.
> ---
> diff --git a/bfd/ChangeLog b/bfd/ChangeLog
> index 2140240..66a7339 100644
> --- a/bfd/ChangeLog
> +++ b/bfd/ChangeLog
> @@ -1,3 +1,12 @@
> +2012-03-09 ?H.J. Lu ?<hongjiu.lu@intel.com>
> +
> + ? ? ? PR ld/13817
> + ? ? ? * bfd/elf32-i386.c (elf_i386_relocate_section): Restore
> + ? ? ? R_386_IRELATIVE.
> +
> + ? ? ? * * elf64-x86-64.c (elf_x86_64_relocate_section): Restore
> + ? ? ? R_X86_64_IRELATIVE.
> +
> ?2012-03-08 ?Tristan Gingold ?<gingold@adacore.com>
>
> ? ? ? ?* vms-lib.c (_bfd_vms_lib_write_archive_contents): Set maximum
> diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
> index d187305..01c0669 100644
> --- a/bfd/elf32-i386.c
> +++ b/bfd/elf32-i386.c
> @@ -3257,7 +3257,6 @@ elf_i386_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ? ?bfd_byte *loc;
> ? ? ? ? ? ? ? ? ?asection *sreloc;
> ? ? ? ? ? ? ? ? ?bfd_vma offset;
> - ? ? ? ? ? ? ? ? bfd_boolean relocate;
>
> ? ? ? ? ? ? ? ? ?/* Need a dynamic relocation to get the real function
> ? ? ? ? ? ? ? ? ? ? adddress. ?*/
> @@ -3278,14 +3277,15 @@ elf_i386_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ? ? ? ?|| info->executable)
> ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ?/* This symbol is resolved locally. ?*/
> - ? ? ? ? ? ? ? ? ? ? outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
> - ? ? ? ? ? ? ? ? ? ? relocate = TRUE;
> + ? ? ? ? ? ? ? ? ? ? outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
> + ? ? ? ? ? ? ? ? ? ? bfd_put_32 (output_bfd,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (h->root.u.def.value
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ h->root.u.def.section->output_section->vma
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ h->root.u.def.section->output_offset),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? contents + offset);
> ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ? ?else
> - ? ? ? ? ? ? ? ? ? {
> - ? ? ? ? ? ? ? ? ? ? outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
> - ? ? ? ? ? ? ? ? ? ? relocate = FALSE;
> - ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ? ? outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
>
> ? ? ? ? ? ? ? ? ?sreloc = htab->elf.irelifunc;
> ? ? ? ? ? ? ? ? ?loc = sreloc->contents;
> @@ -3298,8 +3298,7 @@ elf_i386_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ? ? ? we need to include the symbol value so that it
> ? ? ? ? ? ? ? ? ? ? becomes an addend for the dynamic reloc. ?For an
> ? ? ? ? ? ? ? ? ? ? internal symbol, we have updated addend. ?*/
> - ? ? ? ? ? ? ? ? if (! relocate)
> - ? ? ? ? ? ? ? ? ? continue;
> + ? ? ? ? ? ? ? ? continue;
> ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ?/* FALLTHROUGH */
> ? ? ? ? ? ?case R_386_PC32:
> diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
> index 81ed866..47f1295 100644
> --- a/bfd/elf64-x86-64.c
> +++ b/bfd/elf64-x86-64.c
> @@ -3156,7 +3156,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ?Elf_Internal_Rela outrel;
> ? ? ? ? ? ? ? ? ?asection *sreloc;
> - ? ? ? ? ? ? ? ? bfd_boolean relocate;
>
> ? ? ? ? ? ? ? ? ?/* Need a dynamic relocation to get the real function
> ? ? ? ? ? ? ? ? ? ? address. ?*/
> @@ -3176,15 +3175,15 @@ elf_x86_64_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ? ? ? ?|| info->executable)
> ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ?/* This symbol is resolved locally. ?*/
> - ? ? ? ? ? ? ? ? ? ? outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
> - ? ? ? ? ? ? ? ? ? ? outrel.r_addend = relocation;
> - ? ? ? ? ? ? ? ? ? ? relocate = TRUE;
> + ? ? ? ? ? ? ? ? ? ? outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
> + ? ? ? ? ? ? ? ? ? ? outrel.r_addend = (h->root.u.def.value
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ h->root.u.def.section->output_section->vma
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ h->root.u.def.section->output_offset);
> ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ? ?else
> ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ?outrel.r_info = htab->r_info (h->dynindx, r_type);
> ? ? ? ? ? ? ? ? ? ? ?outrel.r_addend = 0;
> - ? ? ? ? ? ? ? ? ? ? relocate = FALSE;
> ? ? ? ? ? ? ? ? ? ?}
>
> ? ? ? ? ? ? ? ? ?sreloc = htab->elf.irelifunc;
> @@ -3195,8 +3194,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
> ? ? ? ? ? ? ? ? ? ? we need to include the symbol value so that it
> ? ? ? ? ? ? ? ? ? ? becomes an addend for the dynamic reloc. ?For an
> ? ? ? ? ? ? ? ? ? ? internal symbol, we have updated addend. ?*/
> - ? ? ? ? ? ? ? ? if (! relocate)
> - ? ? ? ? ? ? ? ? ? continue;
> + ? ? ? ? ? ? ? ? continue;
> ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ?/* FALLTHROUGH */
> ? ? ? ? ? ?case R_X86_64_PC32:
> diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
> index b49cce5..1e3c5c1 100644
> --- a/ld/testsuite/ChangeLog
> +++ b/ld/testsuite/ChangeLog
> @@ -1,3 +1,11 @@
> +2012-03-09 ?H.J. Lu ?<hongjiu.lu@intel.com>
> +
> + ? ? ? PR ld/13817
> + ? ? ? * ld-i386/pr13302.d: Updated.
> + ? ? ? * ld-x86-64/pr13082-5b.d: Likewise.
> + ? ? ? * ld-x86-64/pr13082-6a.d: Likewise.
> + ? ? ? * ld-x86-64/pr13082-6b.d: Likewise.
> +
> ?2012-03-06 ?Alan Modra ?<amodra@gmail.com>
>
> ? ? ? ?PR ld/13683
> diff --git a/ld/testsuite/ld-i386/pr13302.d b/ld/testsuite/ld-i386/pr13302.d
> index 3d85d08..35c09ae 100644
> --- a/ld/testsuite/ld-i386/pr13302.d
> +++ b/ld/testsuite/ld-i386/pr13302.d
> @@ -5,7 +5,7 @@
>
> ?Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name
> -[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
> +[0-9a-f]+ +[0-9a-f]+ +R_386_IRELATIVE +
>
> ?Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name
> diff --git a/ld/testsuite/ld-x86-64/pr13082-5b.d b/ld/testsuite/ld-x86-64/pr13082-5b.d
> index 48e37c3..1c5a5e7 100644
> --- a/ld/testsuite/ld-x86-64/pr13082-5b.d
> +++ b/ld/testsuite/ld-x86-64/pr13082-5b.d
> @@ -6,7 +6,7 @@
>
> ?Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend
> -[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
> +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
>
> ?Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend
> diff --git a/ld/testsuite/ld-x86-64/pr13082-6a.d b/ld/testsuite/ld-x86-64/pr13082-6a.d
> index de90bb8..9a1a655 100644
> --- a/ld/testsuite/ld-x86-64/pr13082-6a.d
> +++ b/ld/testsuite/ld-x86-64/pr13082-6a.d
> @@ -6,7 +6,7 @@
>
> ?Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend
> -[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
> +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
>
> ?Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend
> diff --git a/ld/testsuite/ld-x86-64/pr13082-6b.d b/ld/testsuite/ld-x86-64/pr13082-6b.d
> index 66ff59b..792c348 100644
> --- a/ld/testsuite/ld-x86-64/pr13082-6b.d
> +++ b/ld/testsuite/ld-x86-64/pr13082-6b.d
> @@ -6,7 +6,7 @@
>
> ?Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend
> -[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
> +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
>
> ?Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> ?Offset ? ? Info ? ?Type ? ? ? ? ? ? ? ?Sym. Value ?Symbol's Name \+ Addend



-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]