diff options
author | Cary Coutant <ccoutant@gmail.com> | 2016-12-21 16:21:23 -0800 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2016-12-21 16:21:23 -0800 |
commit | eb3908448bfe295e49bc7bd8a88b90deaa1ba95f (patch) | |
tree | c705db9301c8b59e10ee5964c06e64e6b56485d8 /gold | |
parent | 514b85276b5521256e1688005e94f1d69fc10c27 (diff) | |
download | gdb-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/ChangeLog | 9 | ||||
-rw-r--r-- | gold/output.cc | 2 | ||||
-rw-r--r-- | gold/output.h | 1 | ||||
-rw-r--r-- | gold/symtab.cc | 9 |
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: |