This is the mail archive of the binutils@sources.redhat.com 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]

[PATCH] gas should honor original section type (was Re: ELFsection identification and gld)


>Clearly gas should not silently replace the section type.  That sounds
>like a bug.

This patch attempts to address this. Built and tested on
i686-pc-linux-gnu.

Jan

bfd/
2004-08-27 Jan Beulich <jbeulich@novell.com>

	* elf.c (_bfd_elf_new_section_hook): Only set various section
	characteristics on new sections.

gas/config/
2004-08-27 Jan Beulich <jbeulich@novell.com>

	* confif/obj-elf.c (obj_elf_change_section): Only set type and
	attributes on new sections. Emit warning when type on
re-declared
	section doesn't match.

gas/testsuite/
2004-08-27 Jan Beulich <jbeulich@novell.com>

	* section5.*: New.

---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/bfd/elf.c	2004-08-19
11:03:15.000000000 +0200
+++ 2004-08-27.13.46-elf-segments/bfd/elf.c	2004-08-27
18:17:12.337508784 +0200
@@ -2224,18 +2224,18 @@ _bfd_elf_new_section_hook (bfd *abfd, as
       if (sdata == NULL)
 	return FALSE;
       sec->used_by_bfd = sdata;
-    }
 
-  elf_section_type (sec) = SHT_NULL;
-  ssect = _bfd_elf_get_sec_type_attr (abfd, sec->name);
-  if (ssect != NULL)
-    {
-      elf_section_type (sec) = ssect->type;
-      elf_section_flags (sec) = ssect->attr;
-    }
+      elf_section_type (sec) = SHT_NULL;
+      ssect = _bfd_elf_get_sec_type_attr (abfd, sec->name);
+      if (ssect != NULL)
+	{
+	  elf_section_type (sec) = ssect->type;
+	  elf_section_flags (sec) = ssect->attr;
+	}
 
-  /* Indicate whether or not this section should use RELA relocations.
 */
-  sec->use_rela_p = get_elf_backend_data (abfd)->default_use_rela_p;
+      /* Indicate whether or not this section should use RELA
relocations.  */
+      sec->use_rela_p = get_elf_backend_data
(abfd)->default_use_rela_p;
+    }
 
   return TRUE;
 }
---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/gas/config/obj-elf.c	2004-06-16
15:22:54.000000000 +0200
+++ 2004-08-27.13.46-elf-segments/gas/config/obj-elf.c	2004-08-27
18:26:53.325185232 +0200
@@ -616,11 +616,6 @@ obj_elf_change_section (const char *name
 	attr |= ssect->attr;
     }
 
-  if (type != SHT_NULL)
-    elf_section_type (sec) = type;
-  if (attr != 0)
-    elf_section_flags (sec) = attr;
-
   /* Convert ELF type and flags to BFD flags.  */
   flags = (SEC_RELOC
 	   | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
@@ -641,6 +636,9 @@ obj_elf_change_section (const char *name
     {
       symbolS *secsym;
 
+      elf_section_type (sec) = type;
+      elf_section_flags (sec) = attr;
+
       /* Prevent SEC_HAS_CONTENTS from being inadvertently set.  */
       if (type == SHT_NOBITS)
 	seg_info (sec)->bss = 1;
@@ -657,19 +655,26 @@ obj_elf_change_section (const char *name
       else
 	symbol_table_insert (section_symbol (sec));
     }
-  else if (attr != 0)
+  else
     {
-      /* If section attributes are specified the second time we see a
-	 particular section, then check that they are the same as we
-	 saw the first time.  */
-      if (((old_sec->flags ^ flags)
-	   & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
-	      | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE |
SEC_STRINGS
-	      | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
-	      | SEC_THREAD_LOCAL)))
-	as_warn (_("ignoring changed section attributes for %s"),
name);
-      if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned)
entsize)
-	as_warn (_("ignoring changed section entity size for %s"),
name);
+      if (type != SHT_NULL
+	  && (unsigned) type != elf_section_type (old_sec))
+	as_warn (_("ignoring changed section type for %s"), name);
+
+      if (attr != 0)
+	{
+	  /* If section attributes are specified the second time we see
a
+	     particular section, then check that they are the same as
we
+	     saw the first time.  */
+	  if (((old_sec->flags ^ flags)
+	       & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
+		  | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE |
SEC_STRINGS
+		  | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
+		  | SEC_THREAD_LOCAL)))
+	    as_warn (_("ignoring changed section attributes for %s"),
name);
+	  if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned)
entsize)
+	    as_warn (_("ignoring changed section entity size for %s"),
name);
+	}
     }
 
 #ifdef md_elf_section_change_hook
---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/gas/testsuite/gas/elf/elf.exp	2004-08-02
10:52:10.000000000 +0200
+++
2004-08-27.13.46-elf-segments/gas/testsuite/gas/elf/elf.exp	2004-08-27
18:20:31.896171256 +0200
@@ -2,7 +2,7 @@
 # elf tests
 #
 
-proc run_list_test { name suffix opts readelf_pipe } {
+proc run_list_test { name suffix opts readelf_opts readelf_pipe } {
     global READELF
     global srcdir subdir
     set testname "elf $name list"
@@ -14,8 +14,8 @@ proc run_list_test { name suffix opts re
 	verbose "output is [file_contents "dump.out"]" 2
 	return
     }
-    send_log "$READELF -s dump.o > dump.out\n"
-    catch "exec $READELF -s dump.o $readelf_pipe > dump.out\n"
comp_output
+    send_log "$READELF $readelf_opts dump.o $readelf_pipe >
dump.out\n"
+    catch "exec $READELF $readelf_opts dump.o $readelf_pipe >
dump.out\n" comp_output
     if ![string match "" $comp_output] then {
 	send_log "$comp_output\n"
 	fail $testname
@@ -56,9 +56,10 @@ if { ([istarget "*-*-elf*"]		
     run_dump_test "group1b" 
     run_dump_test "section0" 
     run_dump_test "section1" 
-    run_list_test "section2" "$target_machine" "-al" ""
-    run_dump_test "section3"
+    run_list_test "section2" "$target_machine" "-al" "-s" ""
+    run_dump_test "section3" 
     run_dump_test "section4"
+    run_list_test "section5" "" "-al" "-S" "| grep
\"\\\\.test\\\[\\\[:digit:\\\]\\\]\""
     run_dump_test "symver" 
-    run_list_test "type" "" "" "| grep \"1 \\\[FONT\\\]\"" 
+    run_list_test "type" "" "" "-s" "| grep \"1 \\\[FONT\\\]\"" 
 }
---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/gas/testsuite/gas/elf/section5.e	1970-01-01
01:00:00.000000000 +0100
+++
2004-08-27.13.46-elf-segments/gas/testsuite/gas/elf/section5.e	2004-08-27
17:25:29.000000000 +0200
@@ -0,0 +1,8 @@
+.* \.test0[ 	]+PROGBITS[ 	]+([[:xdigit:]]+[ 	]+){4}[
	]+[[:digit:]]+.*
+.* \.test1[ 	]+PROGBITS[ 	]+([[:xdigit:]]+[ 	]+){4}[
	]+[[:digit:]]+.*
+.* \.rel\.test1[ 	]+REL[ 	]+.*
+.* \.test2[ 	]+PROGBITS[ 	]+([[:xdigit:]]+[ 	]+){4}[
	]+[[:digit:]]+.*
+.* \.rel\.test2[ 	]+REL[ 	]+.*
+.* \.test3[ 	]+PROGBITS[ 	]+([[:xdigit:]]+[ 	]+){4}WA[
	]+[[:digit:]]+.*
+.* \.rel\.test3[ 	]+REL[ 	]+.*
+.* \.test4[ 	]+NOBITS[ 	]+([[:xdigit:]]+[ 	]+){4}WA[
	]+[[:digit:]]+.*
---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/gas/testsuite/gas/elf/section5.l	1970-01-01
01:00:00.000000000 +0100
+++
2004-08-27.13.46-elf-segments/gas/testsuite/gas/elf/section5.l	2004-08-27
18:09:29.000000000 +0200
@@ -0,0 +1,37 @@
+.*: Assembler messages:
+.*:7: Warning: .*
+.*:7: Warning: .*
+.*:10: Warning: .*
+.*:13: Warning: .*
+.*:16: Warning: .*
+.*:18: Warning: .*
+.*:20: Warning: .*
+.*:22: Warning: .*
+.*:24: Warning: .*
+.*GAS.*
+
+
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test0[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test1,[ 	]*"",[
	]*@progbits[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test2[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test3,[ 	]*"aw"[
	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test4,[ 	]*"aw",[
	]*@nobits[ 	]*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test1,[ 	]*"aw",[
	]*@nobits[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test2,[ 	]*"w"[
	]*
+[ 	]+[[:digit:]]+[ 	]+.*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test3,[ 	]*"aw",[
	]*@progbits[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.test4,[ 	]*"aw"[
	]*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.data,[ 	]*"a"[
	]*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.bss,[ 	]*"a"[
	]*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.data,[ 	]*"aw",[
	]*@nobits[ 	]*
+[ 	]+[[:digit:]]+[ 	]*
+[ 	]+[[:digit:]]+[ 	]+.section[ 	]+.bss,[ 	]*"aw",[
	]*@progbits[ 	]*
---
/home/jbeulich/src/binutils/mainline/2004-08-27.13.46/gas/testsuite/gas/elf/section5.s	1970-01-01
01:00:00.000000000 +0100
+++
2004-08-27.13.46-elf-segments/gas/testsuite/gas/elf/section5.s	2004-08-27
18:06:16.000000000 +0200
@@ -0,0 +1,24 @@
+.section	.test0
+.section	.test1, "", @progbits
+.section	.test2
+.section	.test3, "aw"
+.section	.test4, "aw", @nobits
+
+.section	.test1, "aw", @nobits
+test1:	.long	test1
+
+.section	.test2, "w"
+test2:	.long	test2
+
+.section	.test3, "aw", @progbits
+test3:	.long	test3
+
+.section	.test4, "aw"
+
+.section	.data, "a"
+
+.section	.bss, "a"
+
+.section	.data, "aw", @nobits
+
+.section	.bss, "aw", @progbits

Attachment: binutils-mainline-elf-section.patch
Description: Binary data


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