[PATCH] gas should honor original section type (was Re: ELF section identification and gld)
Jan Beulich
JBeulich@novell.com
Mon Aug 30 06:40:00 GMT 2004
>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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: binutils-mainline-elf-section.patch
Type: application/octet-stream
Size: 8638 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20040830/79b9639d/attachment.obj>
More information about the Binutils
mailing list