+ {
+ d = elf_section_data (sec);
+ d->this_hdr.sh_link = elf_onesymtab (abfd);
+ sec = bfd_get_section_by_name (abfd, ".plt");
+ if (sec)
+ d->this_hdr.sh_info = elf_section_data (sec)->this_idx;
+ }
+ return _bfd_elf_final_write_processing (abfd);
+}
+
+/* Add the dynamic entries required by VxWorks. These point to the
+ tls sections. */
+
+bool
+elf_vxworks_add_dynamic_entries (bfd *output_bfd, struct bfd_link_info *info)
+{
+ if (bfd_get_section_by_name (output_bfd, ".tls_data"))
+ {
+ if (!_bfd_elf_add_dynamic_entry (info, DT_VX_WRS_TLS_DATA_START, 0)
+ || !_bfd_elf_add_dynamic_entry (info, DT_VX_WRS_TLS_DATA_SIZE, 0)
+ || !_bfd_elf_add_dynamic_entry (info, DT_VX_WRS_TLS_DATA_ALIGN, 0))
+ return false;
+ }
+ if (bfd_get_section_by_name (output_bfd, ".tls_vars"))
+ {
+ if (!_bfd_elf_add_dynamic_entry (info, DT_VX_WRS_TLS_VARS_START, 0)
+ || !_bfd_elf_add_dynamic_entry (info, DT_VX_WRS_TLS_VARS_SIZE, 0))
+ return false;
+ }
+ return true;
+}
+
+/* If *DYN is one of the VxWorks-specific dynamic entries, then fill
+ in the value now and return TRUE. Otherwise return FALSE. */
+
+bool
+elf_vxworks_finish_dynamic_entry (bfd *output_bfd, Elf_Internal_Dyn *dyn)
+{
+ asection *sec;
+
+ switch (dyn->d_tag)
+ {
+ default:
+ return false;
+
+ case DT_VX_WRS_TLS_DATA_START:
+ sec = bfd_get_section_by_name (output_bfd, ".tls_data");
+ dyn->d_un.d_ptr = sec->vma;
+ break;
+
+ case DT_VX_WRS_TLS_DATA_SIZE:
+ sec = bfd_get_section_by_name (output_bfd, ".tls_data");
+ dyn->d_un.d_val = sec->size;
+ break;
+
+ case DT_VX_WRS_TLS_DATA_ALIGN:
+ sec = bfd_get_section_by_name (output_bfd, ".tls_data");
+ dyn->d_un.d_val = (bfd_size_type) 1 << bfd_section_alignment (sec);
+ break;
+
+ case DT_VX_WRS_TLS_VARS_START:
+ sec = bfd_get_section_by_name (output_bfd, ".tls_vars");
+ dyn->d_un.d_ptr = sec->vma;
+ break;
+
+ case DT_VX_WRS_TLS_VARS_SIZE:
+ sec = bfd_get_section_by_name (output_bfd, ".tls_vars");
+ dyn->d_un.d_val = sec->size;
+ break;
+ }
+ return true;
+}
+
+/* Add dynamic tags. */
+
+bool
+_bfd_elf_maybe_vxworks_add_dynamic_tags (bfd *output_bfd,
+ struct bfd_link_info *info,
+ bool need_dynamic_reloc)
+{
+ struct elf_link_hash_table *htab = elf_hash_table (info);
+ return (_bfd_elf_add_dynamic_tags (output_bfd, info,
+ need_dynamic_reloc)
+ && (!htab->dynamic_sections_created
+ || htab->target_os != is_vxworks
+ || elf_vxworks_add_dynamic_entries (output_bfd, info)));