From e5caec89a06646ebc0324b1860fb3ff35c60f784 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 5 Mar 2004 11:26:05 +0000 Subject: [PATCH] * elf.c (map_sections_to_segments): Ignore .tbss sections for layout purposes. * ldlang.c (lang_add_section): Don't force SEC_LOAD on SEC_THREAD_LOCAL. (IGNORE_SECTION): Ignore .tbss sections too. (lang_size_sections_1): .tbss sections do not advance dot. * ld-scripts/size.exp: New. * ld-scripts/size-[12].{d,s,t}: New. --- bfd/ChangeLog | 5 +++++ bfd/elf.c | 4 +++- ld/ChangeLog | 7 +++++++ ld/ldlang.c | 23 ++++++++++++----------- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-scripts/size-1.d | 16 ++++++++++++++++ ld/testsuite/ld-scripts/size-1.s | 15 +++++++++++++++ ld/testsuite/ld-scripts/size-1.t | 15 +++++++++++++++ ld/testsuite/ld-scripts/size-2.d | 20 ++++++++++++++++++++ ld/testsuite/ld-scripts/size-2.s | 9 +++++++++ ld/testsuite/ld-scripts/size-2.t | 21 +++++++++++++++++++++ ld/testsuite/ld-scripts/size.exp | 23 +++++++++++++++++++++++ 12 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 ld/testsuite/ld-scripts/size-1.d create mode 100644 ld/testsuite/ld-scripts/size-1.s create mode 100644 ld/testsuite/ld-scripts/size-1.t create mode 100644 ld/testsuite/ld-scripts/size-2.d create mode 100644 ld/testsuite/ld-scripts/size-2.s create mode 100644 ld/testsuite/ld-scripts/size-2.t create mode 100644 ld/testsuite/ld-scripts/size.exp diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e0da01f36c..c16e003abc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2004-03-05 Nathan Sidwell + + * elf.c (map_sections_to_segments): Ignore .tbss sections for + layout purposes. + 2004-03-03 Alexandre Oliva * elflink.c (bfd_elf_record_link_assignment): Mark undefweak and diff --git a/bfd/elf.c b/bfd/elf.c index 5e31f89358..33b58f5bea 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3360,7 +3360,9 @@ map_sections_to_segments (bfd *abfd) { if ((hdr->flags & SEC_READONLY) == 0) writable = TRUE; - last_hdr = hdr; + /* Ignore .tbss section for segment layout purposes. */ + if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL) + last_hdr = hdr; continue; } diff --git a/ld/ChangeLog b/ld/ChangeLog index 81ebfa1d9a..38ac4fed80 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2004-03-05 Nathan Sidwell + + * ldlang.c (lang_add_section): Don't force SEC_LOAD on + SEC_THREAD_LOCAL. + (IGNORE_SECTION): Ignore .tbss sections too. + (lang_size_sections_1): .tbss sections do not advance dot. + 2004-03-01 Andreas Schwab * ld.texinfo (Options): Fix example for --wrap. diff --git a/ld/ldlang.c b/ld/ldlang.c index 4244c9276a..3855998c07 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1101,10 +1101,6 @@ lang_add_section (lang_statement_list_type *ptr, flags &= ~ (SEC_MERGE | SEC_STRINGS); } - /* For now make .tbss normal section. */ - if ((flags & SEC_THREAD_LOCAL) && ! link_info.relocatable) - flags |= SEC_LOAD; - section->output_section->flags |= flags; if (flags & SEC_MERGE) @@ -2770,8 +2766,11 @@ size_input_section (lang_statement_union_type **this_ptr, } #define IGNORE_SECTION(bfd, s) \ - (((bfd_get_section_flags (bfd, s) & (SEC_ALLOC | SEC_NEVER_LOAD)) \ - != SEC_ALLOC) \ + (((bfd_get_section_flags (bfd, s) & SEC_THREAD_LOCAL) \ + ? ((bfd_get_section_flags (bfd, s) & (SEC_LOAD | SEC_NEVER_LOAD)) \ + != SEC_LOAD) \ + : ((bfd_get_section_flags (bfd, s) & (SEC_ALLOC | SEC_NEVER_LOAD)) \ + != SEC_ALLOC)) \ || bfd_section_size (bfd, s) == 0) /* Check to see if any allocated sections overlap with other allocated @@ -3021,15 +3020,17 @@ lang_size_sections_1 if (bfd_is_abs_section (os->bfd_section)) ASSERT (after == os->bfd_section->vma); - else if ((os->bfd_section->flags & SEC_HAS_CONTENTS) == 0 - && (os->bfd_section->flags & SEC_THREAD_LOCAL) - && ! link_info.relocatable) - os->bfd_section->_raw_size = 0; else os->bfd_section->_raw_size = TO_SIZE (after - os->bfd_section->vma); - dot = os->bfd_section->vma + TO_ADDR (os->bfd_section->_raw_size); + dot = os->bfd_section->vma; + /* .tbss sections effectively have zero size. */ + if ((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0 + || (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0 + || link_info.relocatable) + dot += TO_ADDR (os->bfd_section->_raw_size); + os->processed = 1; if (os->update_dot_tree != 0) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 5a33cfff6e..18c66f4612 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-03-05 Nathan Sidwell + + * ld-scripts/size.exp: New. + * ld-scripts/size-[12].{d,s,t}: New. + 2004-03-01 Richard Sandiford * ld-frv/fr450-link[abc].s, fr450-link.d: New test. diff --git a/ld/testsuite/ld-scripts/size-1.d b/ld/testsuite/ld-scripts/size-1.d new file mode 100644 index 0000000000..667f5317db --- /dev/null +++ b/ld/testsuite/ld-scripts/size-1.d @@ -0,0 +1,16 @@ +#source: size-1.s +#ld: -T size-1.t +#objdump: -s + +.*: file format .* + +Contents of section \.text: + 0+00 (01)?000000(01)? (02)?000000(02)? ........ +Contents of section \.data: + 0+08 (03)?000000(03)? (04)?000000(04)? (05)?000000(05)? ............ +Contents of section \.tdata: + 0+24 (06)?000000 07000000 08000000 09000000 ................ + 0+34 (0a)?000000 .... +Contents of section \.map: + 0+38 (08)?000000(08)? (0c)?000000(0c)? (10)?000000(10)? (14)?000000(14)? ................ + 0+48 (18)?000000(18)? .... diff --git a/ld/testsuite/ld-scripts/size-1.s b/ld/testsuite/ld-scripts/size-1.s new file mode 100644 index 0000000000..53721fa4a0 --- /dev/null +++ b/ld/testsuite/ld-scripts/size-1.s @@ -0,0 +1,15 @@ + .section .text,"ax",@progbits + .long 1,2 + + .section .data,"aw",@progbits + .long 3,4,5 + + .section .bss,"aw",@nobits + .long 0,0,0,0 + + # thread local storage sections + .section .tdata,"awT",@progbits + .long 6,7,8,9,10 + + .section .tbss,"awT",@nobits + .long 0,0,0,0,0,0 diff --git a/ld/testsuite/ld-scripts/size-1.t b/ld/testsuite/ld-scripts/size-1.t new file mode 100644 index 0000000000..8582840336 --- /dev/null +++ b/ld/testsuite/ld-scripts/size-1.t @@ -0,0 +1,15 @@ +SECTIONS +{ + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } + .tdata : { *(.tdata) } + .tbss : { *(.tbss) } + .map : { + LONG (SIZEOF (.text)) + LONG (SIZEOF (.data)) + LONG (SIZEOF (.bss)) + LONG (SIZEOF (.tdata)) + LONG (SIZEOF (.tbss)) + } +} diff --git a/ld/testsuite/ld-scripts/size-2.d b/ld/testsuite/ld-scripts/size-2.d new file mode 100644 index 0000000000..3cbfb447d9 --- /dev/null +++ b/ld/testsuite/ld-scripts/size-2.d @@ -0,0 +1,20 @@ +#source: size-2.s +#ld: -T size-2.t +#readelf: -l + +#... +Program Headers: + Type Offset VirtAddr PhysAddr + FileSiz MemSiz Flags Align + PHDR 0x[0-9a-f]+ 0x0+0000 0x0+0000 + 0x[0-9a-f]+ 0x[0-9a-f]+ R . + LOAD 0x[0-9a-f]+ 0x0+0000 0x0+0000 + 0x0+0030 0x0+0030 R [0-9a-f]+ + TLS 0x[0-9a-f]+ 0x0+0008 0x0+0008 + 0x0+0014 0x0+002c R [0-9a-f]+ + + Section to Segment mapping: + Segment Sections... + 00 \.text \.tdata \.tbss \.map + 01 \.text \.tdata \.map + 02 \.tdata \.tbss \.map diff --git a/ld/testsuite/ld-scripts/size-2.s b/ld/testsuite/ld-scripts/size-2.s new file mode 100644 index 0000000000..eba3224c6f --- /dev/null +++ b/ld/testsuite/ld-scripts/size-2.s @@ -0,0 +1,9 @@ + .section .text,"ax",@progbits + .long 1,2 + + # thread local storage sections + .section .tdata,"awT",@progbits + .long 6,7,8,9,10 + + .section .tbss,"awT",@nobits + .long 0,0,0,0,0,0 diff --git a/ld/testsuite/ld-scripts/size-2.t b/ld/testsuite/ld-scripts/size-2.t new file mode 100644 index 0000000000..3549321de1 --- /dev/null +++ b/ld/testsuite/ld-scripts/size-2.t @@ -0,0 +1,21 @@ +PHDRS +{ + header PT_PHDR FILEHDR PHDRS ; + + image PT_LOAD FLAGS (4); + tls PT_TLS FLAGS (4); + +} +SECTIONS +{ + .text : { *(.text) } :image + .tdata : { *(.tdata) } :image :tls + .tbss : { *(.tbss) } :image : tls + .map : { + LONG (SIZEOF (.text)) + LONG (SIZEOF (.data)) + LONG (SIZEOF (.bss)) + LONG (SIZEOF (.tdata)) + LONG (SIZEOF (.tbss)) + } :image +} diff --git a/ld/testsuite/ld-scripts/size.exp b/ld/testsuite/ld-scripts/size.exp new file mode 100644 index 0000000000..5fff2bd879 --- /dev/null +++ b/ld/testsuite/ld-scripts/size.exp @@ -0,0 +1,23 @@ +# Expect script for SIZEOF tests +# Copyright (C) 2004 Free Software Foundation +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +run_dump_test size-1 + +if { [istarget "*-*-elf*"] } { + run_dump_test size-2 +}