summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-devel/binutils/files/2.13/binutils-2.13.90.0.16-tls-strip.patch')
-rw-r--r--sys-devel/binutils/files/2.13/binutils-2.13.90.0.16-tls-strip.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/sys-devel/binutils/files/2.13/binutils-2.13.90.0.16-tls-strip.patch b/sys-devel/binutils/files/2.13/binutils-2.13.90.0.16-tls-strip.patch
new file mode 100644
index 000000000000..3a7b50a5562e
--- /dev/null
+++ b/sys-devel/binutils/files/2.13/binutils-2.13.90.0.16-tls-strip.patch
@@ -0,0 +1,144 @@
+2002-11-30 Jakub Jelinek <jakub@redhat.com>
+
+ * elf.c (elf_sort_sections): Don't reorder .tbss.
+ (assign_file_positions_for_segments): Only adjust off/voff
+ for increased alignment in PT_LOAD or PT_NOTE segment,
+ but adjust p_filesz for .tbss too. in PT_LOAD consider
+ .tbss to have zero memory size.
+ (copy_private_bfd_data) [SECTION_SIZE]: Define.
+ [IS_CONTAINED_BY_VMA, IS_CONTAINED_BY_LMA]: Use it.
+ [INCLUDE_SECTION_IN_SEGMENT]: Only put SHF_TLS sections
+ into PT_TLS segment. Never put SHF_TLS sections in
+ segments other than PT_TLS or PT_LOAD.
+
+--- bfd/elf.c.jj 2002-11-28 15:49:48.000000000 +0100
++++ bfd/elf.c 2002-11-29 23:58:06.000000000 +0100
+@@ -3494,6 +3494,7 @@ elf_sort_sections (arg1, arg2)
+ {
+ const asection *sec1 = *(const asection **) arg1;
+ const asection *sec2 = *(const asection **) arg2;
++ bfd_size_type size1, size2;
+
+ /* Sort by LMA first, since this is the address used to
+ place the section into a segment. */
+@@ -3511,7 +3512,7 @@ elf_sort_sections (arg1, arg2)
+
+ /* Put !SEC_LOAD sections after SEC_LOAD ones. */
+
+-#define TOEND(x) (((x)->flags & SEC_LOAD) == 0)
++#define TOEND(x) (((x)->flags & (SEC_LOAD|SEC_THREAD_LOCAL)) == 0)
+
+ if (TOEND (sec1))
+ {
+@@ -3533,9 +3534,12 @@ elf_sort_sections (arg1, arg2)
+ /* Sort by size, to put zero sized sections
+ before others at the same address. */
+
+- if (sec1->_raw_size < sec2->_raw_size)
++ size1 = (sec1->flags & SEC_LOAD) ? sec1->_raw_size : 0;
++ size2 = (sec2->flags & SEC_LOAD) ? sec2->_raw_size : 0;
++
++ if (size1 < size2)
+ return -1;
+- if (sec1->_raw_size > sec2->_raw_size)
++ if (size1 > size2)
+ return 1;
+
+ return sec1->target_index - sec2->target_index;
+@@ -3816,9 +3820,15 @@ assign_file_positions_for_segments (abfd
+ bfd_vma adjust = sec->lma - (p->p_paddr + p->p_memsz);
+
+ p->p_memsz += adjust;
+- off += adjust;
+- voff += adjust;
+- if ((flags & SEC_LOAD) != 0)
++ if (p->p_type == PT_LOAD
++ || (p->p_type == PT_NOTE
++ && bfd_get_format (abfd) == bfd_core))
++ {
++ off += adjust;
++ voff += adjust;
++ }
++ if ((flags & SEC_LOAD) != 0
++ || (flags & SEC_THREAD_LOCAL) != 0)
+ p->p_filesz += adjust;
+ }
+
+@@ -3875,7 +3885,9 @@ Error: First section in segment (%s) sta
+ || (flags & SEC_HAS_CONTENTS) != 0)
+ off += sec->_raw_size;
+
+- if ((flags & SEC_ALLOC) != 0)
++ if ((flags & SEC_ALLOC) != 0
++ && ((flags & SEC_LOAD) != 0
++ || (flags & SEC_THREAD_LOCAL) == 0))
+ voff += sec->_raw_size;
+ }
+
+@@ -3902,6 +3914,9 @@ Error: First section in segment (%s) sta
+ }
+ else
+ {
++ if ((sec->flags & SEC_LOAD) != 0
++ || (sec->flags & SEC_THREAD_LOCAL) == 0
++ || p->p_type == PT_TLS)
+ p->p_memsz += sec->_raw_size;
+
+ if ((flags & SEC_LOAD) != 0)
+@@ -4545,18 +4560,23 @@ copy_private_bfd_data (ibfd, obfd)
+ (start + (segment->p_memsz > segment->p_filesz \
+ ? segment->p_memsz : segment->p_filesz))
+
++#define SECTION_SIZE(section, segment) \
++ (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
++ != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
++ ? section->_raw_size : 0)
++
+ /* Returns true if the given section is contained within
+ the given segment. VMA addresses are compared. */
+ #define IS_CONTAINED_BY_VMA(section, segment) \
+ (section->vma >= segment->p_vaddr \
+- && (section->vma + section->_raw_size \
++ && (section->vma + SECTION_SIZE (section, segment) \
+ <= (SEGMENT_END (segment, segment->p_vaddr))))
+
+ /* Returns true if the given section is contained within
+ the given segment. LMA addresses are compared. */
+ #define IS_CONTAINED_BY_LMA(section, segment, base) \
+ (section->lma >= base \
+- && (section->lma + section->_raw_size \
++ && (section->lma + SECTION_SIZE (section, segment) \
+ <= SEGMENT_END (segment, base)))
+
+ /* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */
+@@ -4588,7 +4608,9 @@ copy_private_bfd_data (ibfd, obfd)
+ if that is set for the segment and the VMA otherwise,
+ 2. It is an allocated segment,
+ 3. There is an output section associated with it,
+- 4. The section has not already been allocated to a previous segment. */
++ 4. The section has not already been allocated to a previous segment.
++ 5. PT_TLS segment includes only SHF_TLS sections.
++ 6. SHF_TLS sections are only in PT_TLS or PT_LOAD segments. */
+ #define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
+ ((((segment->p_paddr \
+ ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
+@@ -4596,6 +4618,11 @@ copy_private_bfd_data (ibfd, obfd)
+ && (section->flags & SEC_ALLOC) != 0) \
+ || IS_COREFILE_NOTE (segment, section)) \
+ && section->output_section != NULL \
++ && (segment->p_type != PT_TLS \
++ || (section->flags & SEC_THREAD_LOCAL)) \
++ && (segment->p_type == PT_LOAD \
++ || segment->p_type == PT_TLS \
++ || (section->flags & SEC_THREAD_LOCAL) == 0) \
+ && ! section->segment_mark)
+
+ /* Returns true iff seg1 starts after the end of seg2. */
+@@ -5073,6 +5100,7 @@ copy_private_bfd_data (ibfd, obfd)
+ #endif
+
+ #undef SEGMENT_END
++#undef SECTION_SIZE
+ #undef IS_CONTAINED_BY_VMA
+ #undef IS_CONTAINED_BY_LMA
+ #undef IS_COREFILE_NOTE