aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2016-12-21 16:21:23 -0800
committerCary Coutant <ccoutant@gmail.com>2016-12-21 16:21:23 -0800
commiteb3908448bfe295e49bc7bd8a88b90deaa1ba95f (patch)
treec705db9301c8b59e10ee5964c06e64e6b56485d8 /gold
parent514b85276b5521256e1688005e94f1d69fc10c27 (diff)
downloadgdb-eb3908448bfe295e49bc7bd8a88b90deaa1ba95f.zip
gdb-eb3908448bfe295e49bc7bd8a88b90deaa1ba95f.tar.gz
gdb-eb3908448bfe295e49bc7bd8a88b90deaa1ba95f.tar.bz2
Make linker-created symbols relocatable where appropriate.
Linker-created symbols like __ehdr_start, __etext, __edata, and end should be relocatable, not absolute. gold/ * output.cc (Output_segment::first_section): Return NULL if there are no sections in the segment. * output.h (Output_segment::first_section_load_address): Assert that first section is not NULL. * symtab.cc (Symbol_table::sized_write_globals): Attach linker-created segment-relative symbols to first section of the segment.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog9
-rw-r--r--gold/output.cc2
-rw-r--r--gold/output.h1
-rw-r--r--gold/symtab.cc9
4 files changed, 19 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index c953031..ba74545 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2016-12-21 Cary Coutant <ccoutant@gmail.com>
+
+ * output.cc (Output_segment::first_section): Return NULL if there are
+ no sections in the segment.
+ * output.h (Output_segment::first_section_load_address): Assert that
+ first section is not NULL.
+ * symtab.cc (Symbol_table::sized_write_globals): Attach linker-created
+ segment-relative symbols to first section of the segment.
+
2016-12-21 Alan Modra <amodra@gmail.com>
* arm.cc: Fix comment chars with high bit set.
diff --git a/gold/output.cc b/gold/output.cc
index cf934fb..64df3e8 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -4801,7 +4801,7 @@ Output_segment::first_section() const
return (*p)->output_section();
}
}
- gold_unreachable();
+ return NULL;
}
// Return the number of Output_sections in an Output_segment.
diff --git a/gold/output.h b/gold/output.h
index 9083b5a..2b8f0c8 100644
--- a/gold/output.h
+++ b/gold/output.h
@@ -4741,6 +4741,7 @@ class Output_segment
first_section_load_address() const
{
const Output_section* os = this->first_section();
+ gold_assert(os != NULL);
return os->has_load_address() ? os->load_address() : os->address();
}
diff --git a/gold/symtab.cc b/gold/symtab.cc
index 6865190..35989f0 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -3120,7 +3120,14 @@ Symbol_table::sized_write_globals(const Stringpool* sympool,
break;
case Symbol::IN_OUTPUT_SEGMENT:
- shndx = elfcpp::SHN_ABS;
+ {
+ Output_segment* oseg = sym->output_segment();
+ Output_section* osect = oseg->first_section();
+ if (osect == NULL)
+ shndx = elfcpp::SHN_ABS;
+ else
+ shndx = osect->out_shndx();
+ }
break;
case Symbol::IS_CONSTANT: