2003-10-24 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 24 Oct 2003 15:41:23 +0000 (15:41 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 24 Oct 2003 15:41:23 +0000 (15:41 +0000)
* config/obj-elf.c (obj_elf_change_section): Allow SHF_ALLOC
for .interp, .strtab and .symtab. Use specified section
attributes.

gas/ChangeLog
gas/config/obj-elf.c

index 12ce98790883b537f332dab4b7942c6a9c04cf90..0157c697161e9ead86d50a1bcb202b9f7f04ea80 100644 (file)
@@ -1,3 +1,9 @@
+2003-10-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/obj-elf.c (obj_elf_change_section): Allow SHF_ALLOC
+       for .interp, .strtab and .symtab. Use specified section
+       attributes.
+
 2003-10-22  Andreas Schwab  <schwab@suse.de>
            H.J. Lu  <hongjiu.lu@intel.com>
            Jim Wilson <wilson@specifixinc.com>
index f0182a2cdf4970aa8b2fbf78821d363112c2eacf..c9fd1c72abb73e2818228615dd52b6edfe5dc196 100644 (file)
@@ -641,6 +641,8 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
 
   if (ssect != NULL)
     {
+      bfd_boolean override = FALSE;
+
       if (type == SHT_NULL)
        type = ssect->type;
       else if (type != ssect->type)
@@ -669,7 +671,7 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
            }
        }
 
-      if (old_sec == NULL && (attr &ssect->attr) != 0)
+      if (old_sec == NULL && (attr & ~ssect->attr) != 0)
        {
          /* As a GNU extension, we permit a .note section to be
             allocatable.  If the linker sees an allocatable .note
@@ -682,13 +684,25 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
             something like .rodata.str.  */
          else if (ssect->suffix_length == -2
                   && name[ssect->prefix_length] == '.'
-                  && (attr &~ ssect->attr &~ SHF_MERGE &~ SHF_STRINGS) == 0)
+                  && (attr
+                      & ~ssect->attr
+                      & ~SHF_MERGE
+                      & ~SHF_STRINGS) == 0)
            ;
+         /* .interp, .strtab and .symtab can have SHF_ALLOC.  */
+         else if (attr == SHF_ALLOC
+                  && (strcmp (name, ".interp") == 0
+                      || strcmp (name, ".strtab") == 0
+                      || strcmp (name, ".symtab") == 0))
+           override = TRUE;
          else
-           as_warn (_("setting incorrect section attributes for %s"),
-                    name);
+           {
+             as_warn (_("setting incorrect section attributes for %s"),
+                      name);
+             override = TRUE;
+           }
        }
-      if (old_sec == NULL)
+      if (!override && old_sec == NULL)
        attr |= ssect->attr;
     }