diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2014-01-23 08:15:17 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2014-01-23 08:15:17 -0800 |
commit | d923cae027fb7f86d6b684c9084c5521fef0ed56 (patch) | |
tree | 704f7ac89f73761ecb7e3063627dcd9304eac356 /bfd/elf.c | |
parent | 83b645b833a4c137441b2ba1c03206371b28c9db (diff) | |
download | gdb-d923cae027fb7f86d6b684c9084c5521fef0ed56.zip gdb-d923cae027fb7f86d6b684c9084c5521fef0ed56.tar.gz gdb-d923cae027fb7f86d6b684c9084c5521fef0ed56.tar.bz2 |
Issue a linker error if TLS sections are not adjacent
Bad linker script may lead to TLS sections separated by non-TLS sections
in output. This patch changes linker assert to a linker error to
provide better linker diagnosis.
PR ld/16498
* elf.c (_bfd_elf_map_sections_to_segments): Issue a linker error
if TLS sections are not adjacent.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 26 |
1 files changed, 23 insertions, 3 deletions
@@ -4117,11 +4117,31 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info) /* Mandated PF_R. */ m->p_flags = PF_R; m->p_flags_valid = 1; + s = first_tls; for (i = 0; i < (unsigned int) tls_count; ++i) { - BFD_ASSERT (first_tls->flags & SEC_THREAD_LOCAL); - m->sections[i] = first_tls; - first_tls = first_tls->next; + if ((s->flags & SEC_THREAD_LOCAL) == 0) + { + _bfd_error_handler + (_("%B: TLS sections are not adjacent:"), abfd); + s = first_tls; + i = 0; + while (i < (unsigned int) tls_count) + { + if ((s->flags & SEC_THREAD_LOCAL) != 0) + { + _bfd_error_handler (_(" TLS: %A"), s); + i++; + } + else + _bfd_error_handler (_(" non-TLS: %A"), s); + s = s->next; + } + bfd_set_error (bfd_error_bad_value); + goto error_return; + } + m->sections[i] = s; + s = s->next; } *pm = m; |