struct mach_o_segment_name_xlat
{
+ /* Segment name. */
const char *segname;
+
+ /* List of known sections for the segment. */
const struct mach_o_section_name_xlat *sections;
};
+/* List of known segment names. */
+
static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
{
- { "__DWARF", dwarf_section_names_xlat },
{ "__TEXT", text_section_names_xlat },
{ "__DATA", data_section_names_xlat },
+ { "__DWARF", dwarf_section_names_xlat },
{ NULL, NULL }
};
}
}
+/* Convert Mach-O section name to BFD. Try to use standard names, otherwise
+ forge a new name. SEGNAME and SECTNAME are 16 bytes strings. */
+
static void
bfd_mach_o_convert_section_name_to_bfd
(bfd *abfd, const char *segname, const char *sectname,
if (*name)
return;
- len = strlen (segname) + 1 + strlen (sectname) + 1;
+ len = 16 + 1 + 16 + 1;
/* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
with an underscore. */
res = bfd_alloc (abfd, len);
if (res == NULL)
return;
- snprintf (res, len, "%s%s.%s", pfx, segname, sectname);
+ snprintf (res, len, "%s%.16s.%.16s", pfx, segname, sectname);
*name = res;
*flags = SEC_NO_FLAGS;
}
struct mach_o_section_32_external raw;
memcpy (raw.sectname, section->sectname, 16);
- memcpy (raw.segname + 16, section->segname, 16);
+ memcpy (raw.segname, section->segname, 16);
bfd_h_put_32 (abfd, section->addr, raw.addr);
bfd_h_put_32 (abfd, section->size, raw.size);
bfd_h_put_32 (abfd, section->offset, raw.offset);
| BFD_MACH_O_PROT_EXECUTE;
seg->initprot = seg->maxprot;
seg->flags = 0;
+ seg->sect_head = NULL;
+ seg->sect_tail = NULL;
/* Create Mach-O sections. */
target_index = 0;
!= BFD_MACH_O_SECTION_SIZE))
return NULL;
- sec = bfd_mach_o_make_bfd_section (abfd, raw.sectname, raw.segname);
+ sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
if (sec == NULL)
return NULL;
!= BFD_MACH_O_SECTION_64_SIZE))
return NULL;
- sec = bfd_mach_o_make_bfd_section (abfd, raw.sectname, raw.segname);
+ sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
if (sec == NULL)
return NULL;
seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
seg->flags = bfd_h_get_32 (abfd, raw.flags);
}
+ seg->sect_head = NULL;
+ seg->sect_tail = NULL;
for (i = 0; i < seg->nsects; i++)
{