aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-02-21 10:51:24 +0000
committerNick Clifton <nickc@redhat.com>2003-02-21 10:51:24 +0000
commitcf888e70e2758491576cefa40a7dee1ac1924ec2 (patch)
tree94834224880cb557c45ad2817fceae16601dbd60
parentc12536277750567d79cc50bd79525bad6f8e28ab (diff)
downloadfsf-binutils-gdb-cf888e70e2758491576cefa40a7dee1ac1924ec2.zip
fsf-binutils-gdb-cf888e70e2758491576cefa40a7dee1ac1924ec2.tar.gz
fsf-binutils-gdb-cf888e70e2758491576cefa40a7dee1ac1924ec2.tar.bz2
Disable region size checking whilst relaxing sections.
-rw-r--r--ld/ChangeLog17
-rw-r--r--ld/emultempl/elf32.em2
-rw-r--r--ld/emultempl/hppaelf.em8
-rw-r--r--ld/emultempl/ppc64elf.em4
-rw-r--r--ld/ldlang.c66
-rw-r--r--ld/ldlang.h4
-rw-r--r--ld/pe-dll.c4
7 files changed, 70 insertions, 35 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 307fd54..30bfed0 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,22 @@
2003-02-21 Bob Wilson <bob.wilson@acm.org>
+ * ldlang.c (lang_size_sections_1): Add CHECK_REGIONS argument and only
+ call os_region_check when it is set.
+ (lang_size_sections): Add CHECK_REGIONS argument and pass it through to
+ lang_size_sections_1.
+ (lang_process): Change lang_size_sections calls to set CHECK_REGIONS
+ only for the last call, not on every relaxation iteration.
+ * ldlang.h (lang_size_sections): Update prototype.
+ * pe-dll.c (pe_dll_fill_sections): Set CHECK_REGIONS argument in calls
+ to lang_size_sections.
+ (pe_exe_fill_sections): Likewise.
+ * emultempl/elf32.em (gld${EMULATION_NAME}_finish): Likewise.
+ * emultempl/hppaelf.em (hppaelf_layout_sections_again): Likewise.
+ * emultempl/ppc64elf.em (ppc_before_allocation): Likewise.
+ (ppc_layout_sections_again): Likewise.
+
+2003-02-21 Bob Wilson <bob.wilson@acm.org>
+
* gen-doc.texi: Set ARM and HPPA variables.
* ld.texinfo: Fix typos and obvious texinfo mistakes. Make section
title capitalization more consistent. Add missing menu entries for
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index d58a3c9..c401fe2 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1427,7 +1427,7 @@ gld${EMULATION_NAME}_finish ()
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
/* Redo special stuff. */
ldemul_after_allocation ();
diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
index c44b01a..9f94b84 100644
--- a/ld/emultempl/hppaelf.em
+++ b/ld/emultempl/hppaelf.em
@@ -1,5 +1,5 @@
# This shell script emits a C file. -*- C -*-
-# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002
+# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
#
# This file is part of GLD, the Gnu Linker.
@@ -27,7 +27,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
#include "ldctor.h"
#include "elf32-hppa.h"
-static void hppaelf_after_parse PARAMS((void));
+static void hppaelf_after_parse PARAMS ((void));
static void hppaelf_create_output_section_statements PARAMS ((void));
static asection *hppaelf_add_stub_section
PARAMS ((const char *, asection *));
@@ -60,7 +60,7 @@ hppaelf_after_parse ()
{
if (link_info.relocateable)
lang_add_unique (".text");
-#if 0 /* enable this once we split millicode stuff from libgcc */
+#if 0 /* Enable this once we split millicode stuff from libgcc. */
else
lang_add_input_file ("milli",
lang_input_file_is_l_enum,
@@ -231,7 +231,7 @@ hppaelf_layout_sections_again ()
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
/* Redo special stuff. */
ldemul_after_allocation ();
diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
index b524e01..925c27f 100644
--- a/ld/emultempl/ppc64elf.em
+++ b/ld/emultempl/ppc64elf.em
@@ -118,7 +118,7 @@ ppc_before_allocation ()
/* Size the sections. This is premature, but we want to know the
TLS segment layout so that certain optimizations can be done. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
if (!ppc64_elf_tls_optimize (output_bfd, &link_info))
{
@@ -273,7 +273,7 @@ ppc_layout_sections_again ()
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
/* Recalculate TOC base. */
ldemul_after_allocation ();
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 0feeb69..283b970 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1,6 +1,6 @@
/* Linker command language support.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002
+ 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@@ -41,14 +41,10 @@
#include "demangle.h"
#ifndef offsetof
-#define offsetof(TYPE,MEMBER) ((size_t)&(((TYPE*)0)->MEMBER))
+#define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER))
#endif
-/* FORWARDS */
-static lang_statement_union_type *new_statement
- PARAMS ((enum statement_enum, size_t, lang_statement_list_type *));
-
-/* LOCALS */
+/* Locals variables. */
static struct obstack stat_obstack;
#define obstack_chunk_alloc xmalloc
@@ -65,6 +61,9 @@ static const char *output_target;
static lang_statement_list_type statement_list;
static struct lang_phdr *lang_phdr_list;
+/* Forward declarations. */
+static lang_statement_union_type *new_statement
+ PARAMS ((enum statement_enum, size_t, lang_statement_list_type *));
static void lang_for_each_statement_worker
PARAMS ((void (*) (lang_statement_union_type *),
lang_statement_union_type *));
@@ -201,7 +200,8 @@ static void os_region_check
struct memory_region_struct *, etree_type *, bfd_vma));
static bfd_vma lang_size_sections_1
PARAMS ((lang_statement_union_type *, lang_output_section_statement_type *,
- lang_statement_union_type **, fill_type *, bfd_vma, bfd_boolean *));
+ lang_statement_union_type **, fill_type *, bfd_vma, bfd_boolean *,
+ bfd_boolean));
typedef void (*callback_t)
PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *,
lang_input_statement_type *, PTR));
@@ -226,7 +226,7 @@ static int closest_target_match
static char * get_first_input_target
PARAMS ((void));
-/* EXPORTS */
+/* Exported variables. */
lang_output_section_statement_type *abs_output_section;
lang_statement_list_type lang_output_section_statement;
lang_statement_list_type *stat_ptr = &statement_list;
@@ -2971,13 +2971,15 @@ os_region_check (os, region, tree, base)
/* Set the sizes for all the output sections. */
static bfd_vma
-lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
+lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax,
+ check_regions)
lang_statement_union_type *s;
lang_output_section_statement_type *output_section_statement;
lang_statement_union_type **prev;
fill_type *fill;
bfd_vma dot;
bfd_boolean *relax;
+ bfd_boolean check_regions;
{
unsigned opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture,
ldfile_output_machine);
@@ -3047,6 +3049,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
&& (bfd_get_section_flags (output_bfd, os->bfd_section)
& SEC_NEVER_LOAD) == 0
&& ! link_info.relocateable
+ && check_regions
&& strcmp (os->region->name, "*default*") == 0
&& lang_memory_region_list != NULL
&& (strcmp (lang_memory_region_list->name,
@@ -3098,7 +3101,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
}
lang_size_sections_1 (os->children.head, os, &os->children.head,
- os->fill, dot, relax);
+ os->fill, dot, relax, check_regions);
/* Put the section within the requested block size, or
align at the block boundary. */
@@ -3139,9 +3142,10 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
{
os->region->current = dot;
- /* Make sure the new address is within the region. */
- os_region_check (os, os->region, os->addr_tree,
- os->bfd_section->vma);
+ if (check_regions)
+ /* Make sure the new address is within the region. */
+ os_region_check (os, os->region, os->addr_tree,
+ os->bfd_section->vma);
/* If there's no load address specified, use the run
region as the load region. */
@@ -3154,8 +3158,9 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
os->load_base = exp_intop (os->lma_region->current);
os->lma_region->current +=
os->bfd_section->_raw_size / opb;
- os_region_check (os, os->lma_region, NULL,
- os->bfd_section->lma);
+ if (check_regions)
+ os_region_check (os, os->lma_region, NULL,
+ os->bfd_section->lma);
}
}
}
@@ -3165,7 +3170,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
dot = lang_size_sections_1 (constructor_list.head,
output_section_statement,
&s->wild_statement.children.head,
- fill, dot, relax);
+ fill, dot, relax, check_regions);
break;
case lang_data_statement_enum:
@@ -3229,7 +3234,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
dot = lang_size_sections_1 (s->wild_statement.children.head,
output_section_statement,
&s->wild_statement.children.head,
- fill, dot, relax);
+ fill, dot, relax, check_regions);
break;
@@ -3327,7 +3332,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
dot = lang_size_sections_1 (s->group_statement.children.head,
output_section_statement,
&s->group_statement.children.head,
- fill, dot, relax);
+ fill, dot, relax, check_regions);
break;
default:
@@ -3344,19 +3349,21 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
}
bfd_vma
-lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
+lang_size_sections (s, output_section_statement, prev, fill, dot, relax,
+ check_regions)
lang_statement_union_type *s;
lang_output_section_statement_type *output_section_statement;
lang_statement_union_type **prev;
fill_type *fill;
bfd_vma dot;
bfd_boolean *relax;
+ bfd_boolean check_regions;
{
bfd_vma result;
exp_data_seg.phase = exp_dataseg_none;
result = lang_size_sections_1 (s, output_section_statement, prev, fill,
- dot, relax);
+ dot, relax, check_regions);
if (exp_data_seg.phase == exp_dataseg_end_seen)
{
/* If DATA_SEGMENT_ALIGN DATA_SEGMENT_END pair was seen, check whether
@@ -3372,7 +3379,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
{
exp_data_seg.phase = exp_dataseg_adjust;
result = lang_size_sections_1 (s, output_section_statement, prev,
- fill, dot, relax);
+ fill, dot, relax, check_regions);
}
}
@@ -4348,7 +4355,8 @@ lang_process ()
/* Size up the sections. */
lang_size_sections (statement_list.head,
abs_output_section,
- &statement_list.head, 0, (bfd_vma) 0, NULL);
+ &statement_list.head, 0, (bfd_vma) 0, NULL,
+ command_line.relax ? FALSE : TRUE);
/* Now run around and relax if we can. */
if (command_line.relax)
@@ -4377,9 +4385,19 @@ lang_process ()
lang_size_sections (statement_list.head,
abs_output_section,
&statement_list.head, 0, (bfd_vma) 0,
- &relax_again);
+ &relax_again, FALSE);
}
while (relax_again);
+
+ /* Final extra sizing to report errors. */
+ lang_reset_memory_regions ();
+ lang_do_assignments (statement_list.head,
+ abs_output_section,
+ (fill_type *) 0, (bfd_vma) 0);
+ lang_size_sections (statement_list.head,
+ abs_output_section,
+ & statement_list.head, 0, (bfd_vma) 0,
+ NULL, TRUE);
}
/* See if anything special should be done now we know how big
diff --git a/ld/ldlang.h b/ld/ldlang.h
index a0fe137..7dd4efd 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -1,6 +1,6 @@
/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002
+ 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@@ -476,7 +476,7 @@ extern bfd_vma lang_size_sections
PARAMS ((lang_statement_union_type *s,
lang_output_section_statement_type *output_section_statement,
lang_statement_union_type **prev, fill_type *fill,
- bfd_vma dot, bfd_boolean *relax));
+ bfd_vma dot, bfd_boolean *relax, bfd_boolean check_regions));
extern void lang_enter_group
PARAMS ((void));
extern void lang_leave_group
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index 5b7a741..95cdd7e 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -2694,7 +2694,7 @@ pe_dll_fill_sections (abfd, info)
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
/* Redo special stuff. */
ldemul_after_allocation ();
@@ -2728,7 +2728,7 @@ pe_exe_fill_sections (abfd, info)
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
/* Redo special stuff. */
ldemul_after_allocation ();