From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15157 invoked by alias); 31 Jan 2016 00:09:09 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 15130 invoked by uid 89); 31 Jan 2016 00:09:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=hongjiuluintelcom, hongjiu.lu@intel.com, r_sym, dca X-HELO: mail-pa0-f48.google.com Received: from mail-pa0-f48.google.com (HELO mail-pa0-f48.google.com) (209.85.220.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sun, 31 Jan 2016 00:09:06 +0000 Received: by mail-pa0-f48.google.com with SMTP id ho8so61063397pac.2 for ; Sat, 30 Jan 2016 16:09:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-type:content-disposition:user-agent; bh=2ljY+KLIJRJcGX0EhYqsN/IOqBCUMCo+2prbSPNFSKs=; b=NwUpxR2dd2caKc2JDJqHZAp8unPDUfn8WFYjk4O7/UPd9eusTVvGEK8s/Owe+h4II2 UKvn74lqWCWRgvcAqbXebiEyCfdeuSgyoqqgTjXknrqknT3J/AnzMj9Z3Gh56w9NFITQ sj/yp5bKHEo0h/6b9E9LNHJcuuLW14AWQ6SaL2Drn7oAcZhyH1vffjMAuOX1h0UF93VN hdCeED94DrqcidwzxyPNbvMlzMhXq7qZIt5ABj0gCVRXNo/YuNmdDO1kmaxE42BnXR7B hqVk3tsrfzYUZDXvvk3BG4iS6er2uNphlaFVvHx7u6Qq/womxPs4taJR9qoGliVV+/Nl Tmyw== X-Gm-Message-State: AG10YOSDmcP1nxWMNOxWFBu2U2d5etL5Sx2VhTAiyTW4qmJWIQgJufIGx7u7+baAOm0JWg== X-Received: by 10.66.237.102 with SMTP id vb6mr25866163pac.133.1454198945131; Sat, 30 Jan 2016 16:09:05 -0800 (PST) Received: from gnu-tools-1.localdomain ([2602:304:cdc3:b260:208:caff:fef7:b10a]) by smtp.gmail.com with ESMTPSA id n27sm32828409pfb.53.2016.01.30.16.09.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Jan 2016 16:09:04 -0800 (PST) Received: by gnu-tools-1.localdomain (Postfix, from userid 1000) id BAF58208B5; Sat, 30 Jan 2016 16:09:03 -0800 (PST) Date: Sun, 31 Jan 2016 00:09:00 -0000 From: "H.J. Lu" To: binutils@sourceware.org Subject: [committed, PATCH] Check reloc against IFUNC symbol only with dynamic symbols Message-ID: <20160131000903.GA2574@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-IsSubscribed: yes X-SW-Source: 2016-01/txt/msg00351.txt.bz2 There is no need to check relocation IFUNC symbol if there are no dynamic symbols. bfd/ PR ld/19539 * elf32-i386.c (elf_i386_reloc_type_class): Check relocation against STT_GNU_IFUNC symbol only with dynamic symbols. * elf64-x86-64.c (elf_x86_64_reloc_type_class): Likewise. ld/ PR ld/19539 * testsuite/ld-elf/pr19539.d: New file. * testsuite/ld-elf/pr19539.s: Likewise. * testsuite/ld-elf/pr19539.t: Likewise. --- bfd/ChangeLog | 7 +++++++ bfd/elf32-i386.c | 28 ++++++++++++++++------------ bfd/elf64-x86-64.c | 28 ++++++++++++++++------------ ld/ChangeLog | 7 +++++++ ld/testsuite/ld-elf/pr19539.d | 8 ++++++++ ld/testsuite/ld-elf/pr19539.s | 2 ++ ld/testsuite/ld-elf/pr19539.t | 1 + 7 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr19539.d create mode 100644 ld/testsuite/ld-elf/pr19539.s create mode 100644 ld/testsuite/ld-elf/pr19539.t diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7c46423..d6e4d03 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2016-01-30 H.J. Lu + + PR ld/19539 + * elf32-i386.c (elf_i386_reloc_type_class): Check relocation + against STT_GNU_IFUNC symbol only with dynamic symbols. + * elf64-x86-64.c (elf_x86_64_reloc_type_class): Likewise. + 2016-01-28 H.J. Lu PR binutils/19523 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 5bf715f..81a95e0 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -5355,19 +5355,23 @@ elf_i386_reloc_type_class (const struct bfd_link_info *info, bfd *abfd = info->output_bfd; const struct elf_backend_data *bed = get_elf_backend_data (abfd); struct elf_link_hash_table *htab = elf_hash_table (info); - unsigned long r_symndx = ELF32_R_SYM (rela->r_info); - Elf_Internal_Sym sym; - - if (htab->dynsym == NULL - || !bed->s->swap_symbol_in (abfd, - (htab->dynsym->contents - + r_symndx * sizeof (Elf32_External_Sym)), - 0, &sym)) - abort (); - /* Check relocation against STT_GNU_IFUNC symbol. */ - if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) - return reloc_class_ifunc; + if (htab->dynsym != NULL + && htab->dynsym->contents != NULL) + { + /* Check relocation against STT_GNU_IFUNC symbol if there are + dynamic symbols. */ + unsigned long r_symndx = ELF32_R_SYM (rela->r_info); + Elf_Internal_Sym sym; + if (!bed->s->swap_symbol_in (abfd, + (htab->dynsym->contents + + r_symndx * sizeof (Elf32_External_Sym)), + 0, &sym)) + abort (); + + if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) + return reloc_class_ifunc; + } switch (ELF32_R_TYPE (rela->r_info)) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index bbdb03a..37528be 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -5728,19 +5728,23 @@ elf_x86_64_reloc_type_class (const struct bfd_link_info *info, bfd *abfd = info->output_bfd; const struct elf_backend_data *bed = get_elf_backend_data (abfd); struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info); - unsigned long r_symndx = htab->r_sym (rela->r_info); - Elf_Internal_Sym sym; - - if (htab->elf.dynsym == NULL - || !bed->s->swap_symbol_in (abfd, - (htab->elf.dynsym->contents - + r_symndx * bed->s->sizeof_sym), - 0, &sym)) - abort (); - /* Check relocation against STT_GNU_IFUNC symbol. */ - if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) - return reloc_class_ifunc; + if (htab->elf.dynsym != NULL + && htab->elf.dynsym->contents != NULL) + { + /* Check relocation against STT_GNU_IFUNC symbol if there are + dynamic symbols. */ + unsigned long r_symndx = htab->r_sym (rela->r_info); + Elf_Internal_Sym sym; + if (!bed->s->swap_symbol_in (abfd, + (htab->elf.dynsym->contents + + r_symndx * bed->s->sizeof_sym), + 0, &sym)) + abort (); + + if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) + return reloc_class_ifunc; + } switch ((int) ELF32_R_TYPE (rela->r_info)) { diff --git a/ld/ChangeLog b/ld/ChangeLog index b9eac34..34b4feb 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2016-01-30 H.J. Lu + + PR ld/19539 + * testsuite/ld-elf/pr19539.d: New file. + * testsuite/ld-elf/pr19539.s: Likewise. + * testsuite/ld-elf/pr19539.t: Likewise. + 2016-01-29 H.J. Lu PR ld/19533 diff --git a/ld/testsuite/ld-elf/pr19539.d b/ld/testsuite/ld-elf/pr19539.d new file mode 100644 index 0000000..363aeee --- /dev/null +++ b/ld/testsuite/ld-elf/pr19539.d @@ -0,0 +1,8 @@ +#source: start.s +#source: pr19539.s +#ld: -pie -T pr19539.t +#readelf : --dyn-syms --wide +#target: *-*-linux* *-*-gnu* *-*-solaris* + +Symbol table '\.dynsym' contains [0-9]+ entries: +#pass diff --git a/ld/testsuite/ld-elf/pr19539.s b/ld/testsuite/ld-elf/pr19539.s new file mode 100644 index 0000000..0f55d3f --- /dev/null +++ b/ld/testsuite/ld-elf/pr19539.s @@ -0,0 +1,2 @@ + .section .prefix,"a",%progbits + .dc.a foo diff --git a/ld/testsuite/ld-elf/pr19539.t b/ld/testsuite/ld-elf/pr19539.t new file mode 100644 index 0000000..b6b48e7 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19539.t @@ -0,0 +1 @@ +HIDDEN (foo = .); -- 2.5.0