[binutils-gdb] FIXME for merging of e_flags and .gnu.attributes

Alan Modra amodra@sourceware.org
Fri May 1 06:03:19 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6b728d3286a6e073e8cbdb63600e421de4f32dad

commit 6b728d3286a6e073e8cbdb63600e421de4f32dad
Author: Alan Modra <amodra@gmail.com>
Date:   Fri May 1 15:20:14 2020 +0930

    FIXME for merging of e_flags and .gnu.attributes
    
    Code in the linker, present before the addition of .gnu.attributes
    support, results in shared libraries not being considered by BFD when
    merging e_flags and .gnu.attributes from input files to the output.
    That doesn't seem correct to me, but I don't know enough about all the
    various ABIs to change the behaviour with any confidence.  So this
    patch merely punts on dynamic objects in merge_private_bfd_data target
    functions, with a FIXME for maintainer attention.
    
    I haven't excluded shared libraries from being considered where the
    target merge_private_bfd_data (a) already has code dealing with shared
    libraries, or (b) where that function just sets the output to the most
    constraining arch/mach combination and other fairly trivial merges, or
    (c) when the target has no shared library linker support.
    
    In (a) are: arc, arm, aarch64, riscv, sparc.
    In (b) are: bpf, cris, csky, m32r, m68k, mn10300, nios2, tilegx,
                tilepro, vax, visium, xtensa.
    In (c) are: bpf, cr16, h8300, iq2000, m32c, m68hc11, m68hc12, mcore,
                mep, msp430, mt, rl78, rx, v850.
    
            PR 25882
            * elf32-bfin.c (elf32_bfin_merge_private_bfd_data): Add FIXME.
            * elf32-frv.c (frv_elf_merge_private_bfd_data): Likewise.
            * elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Likewise.
            * elf32-nds32.c (nds32_elf_merge_private_bfd_data): Likewise.
            * elf32-score.c (s3_elf32_score_merge_private_bfd_data): Likewise.
            * elf32-score7.c (s7_elf32_score_merge_private_bfd_data): Likewise.
            * elf32-sh.c (sh_elf_merge_private_data): Likewise.
            * elf32-tic6x.c (elf32_tic6x_merge_attributes): Likewise.
            * elf64-ia64-vms.c (elf64_ia64_merge_private_bfd_data): Likewise.
            * elfnn-ia64.c (elfNN_ia64_merge_private_bfd_data): Likewise.

Diff:
---
 bfd/ChangeLog        | 14 ++++++++++++++
 bfd/elf32-bfin.c     |  4 ++++
 bfd/elf32-frv.c      |  4 ++++
 bfd/elf32-nds32.c    |  4 ++++
 bfd/elf32-score.c    |  4 ++++
 bfd/elf32-score7.c   |  4 ++++
 bfd/elf32-sh.c       |  4 ++++
 bfd/elf32-tic6x.c    |  4 ++++
 bfd/elf64-ia64-vms.c |  4 ++++
 bfd/elfnn-ia64.c     |  4 ++++
 bfd/elfxx-mips.c     |  1 +
 11 files changed, 51 insertions(+)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1413be60adc..fc1aca2a391 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,17 @@
+2020-05-01  Alan Modra  <amodra@gmail.com>
+
+	PR 25882
+	* elf32-bfin.c (elf32_bfin_merge_private_bfd_data): Add FIXME.
+	* elf32-frv.c (frv_elf_merge_private_bfd_data): Likewise.
+	* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Likewise.
+	* elf32-nds32.c (nds32_elf_merge_private_bfd_data): Likewise.
+	* elf32-score.c (s3_elf32_score_merge_private_bfd_data): Likewise.
+	* elf32-score7.c (s7_elf32_score_merge_private_bfd_data): Likewise.
+	* elf32-sh.c (sh_elf_merge_private_data): Likewise.
+	* elf32-tic6x.c (elf32_tic6x_merge_attributes): Likewise.
+	* elf64-ia64-vms.c (elf64_ia64_merge_private_bfd_data): Likewise.
+	* elfnn-ia64.c (elfNN_ia64_merge_private_bfd_data): Likewise.
+
 2020-05-01  Alan Modra  <amodra@gmail.com>
 
 	PR 25882
diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
index e5a83ba49a1..e6383a782ff 100644
--- a/bfd/elf32-bfin.c
+++ b/bfd/elf32-bfin.c
@@ -4755,6 +4755,10 @@ elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   flagword old_flags, new_flags;
   bfd_boolean error = FALSE;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
 
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index 056cc93055d..d2a18fd564a 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -6344,6 +6344,10 @@ frv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   char new_opt[80];
   char old_opt[80];
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   new_opt[0] = old_opt[0] = '\0';
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c
index fc4d002f0d9..6b0b813af0b 100644
--- a/bfd/elf32-nds32.c
+++ b/bfd/elf32-nds32.c
@@ -6817,6 +6817,10 @@ nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   flagword out_fpu_config;
   flagword in_fpu_config;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   /* TODO: Revise to use object-attributes instead.  */
   if (!nds32_check_vec_size (ibfd))
     return FALSE;
diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c
index c5e6346e93f..d1a910f2795 100644
--- a/bfd/elf32-score.c
+++ b/bfd/elf32-score.c
@@ -4021,6 +4021,10 @@ s3_elf32_score_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   if (!_bfd_generic_verify_endian_match (ibfd, info))
     return FALSE;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   in_flags  = elf_elfheader (ibfd)->e_flags;
   out_flags = elf_elfheader (obfd)->e_flags;
 
diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c
index 0f647feaeb8..ab5e32a29a4 100644
--- a/bfd/elf32-score7.c
+++ b/bfd/elf32-score7.c
@@ -3826,6 +3826,10 @@ s7_elf32_score_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   if (!_bfd_generic_verify_endian_match (ibfd, info))
     return FALSE;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   in_flags  = elf_elfheader (ibfd)->e_flags;
   out_flags = elf_elfheader (obfd)->e_flags;
 
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
index 24e879e4f41..24203e0d555 100644
--- a/bfd/elf32-sh.c
+++ b/bfd/elf32-sh.c
@@ -6028,6 +6028,10 @@ sh_elf_merge_private_data (bfd *ibfd, struct bfd_link_info *info)
 {
   bfd *obfd = info->output_bfd;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
 
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index 95814d3abf1..d07902fe8a7 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -3724,6 +3724,10 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
   int i;
   int array_align_in, array_align_out, array_expect_in, array_expect_out;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   if (!elf_known_obj_attributes_proc (obfd)[0].i)
     {
       /* This is the first object.  Copy the attributes.  */
diff --git a/bfd/elf64-ia64-vms.c b/bfd/elf64-ia64-vms.c
index d40fa4277a2..159698fa07f 100644
--- a/bfd/elf64-ia64-vms.c
+++ b/bfd/elf64-ia64-vms.c
@@ -4233,6 +4233,10 @@ elf64_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   flagword in_flags;
   bfd_boolean ok = TRUE;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   /* Don't even pretend to support mixed-format linking.  */
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
index cd94158aba1..0cdd6b58c9d 100644
--- a/bfd/elfnn-ia64.c
+++ b/bfd/elfnn-ia64.c
@@ -4744,6 +4744,10 @@ elfNN_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   flagword in_flags;
   bfd_boolean ok = TRUE;
 
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return TRUE;
+
   if (!is_ia64_elf (ibfd) || !is_ia64_elf (obfd))
     return TRUE;
 
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 2f26d7ae832..9ce205e9cf6 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -15767,6 +15767,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   /* Check to see if the input BFD actually contains any sections.  If not,
      then it has no attributes, and its flags may not have been initialized
      either, but it cannot actually cause any incompatibility.  */
+  /* FIXME: This excludes any input shared library from consideration.  */
   for (sec = ibfd->sections; sec != NULL; sec = sec->next)
     {
       /* Ignore synthetic sections and empty .text, .data and .bss sections


More information about the Binutils-cvs mailing list