+ off_t nametab_offset;
+ off_t index_offset;
+
+ if ((gnu_sections_found & SOMO_WRAPPING) != SOMO_WRAPPING)
+ {
+ *errmsg = "GNU Mach-o section wrapper: required section missing";
+ *err = 0; /* No useful errno. */
+ XDELETEVEC (secdata);
+ return 0;
+ }
+
+ /* Fetch the name table. */
+
+ simple_object_mach_o_section_info (omr->is_big_endian, is_32,
+ secdata + nametab_index * sechdrsize,
+ &nametab_offset, &nametab_size);
+ nametab = XNEWVEC (char, nametab_size);
+ if (!simple_object_internal_read (sobj->descriptor,
+ sobj->offset + nametab_offset,
+ (unsigned char *) nametab, nametab_size,
+ errmsg, err))
+ {
+ XDELETEVEC (nametab);
+ XDELETEVEC (secdata);
+ return 0;
+ }
+
+ /* Fetch the index. */
+
+ simple_object_mach_o_section_info (omr->is_big_endian, is_32,
+ secdata + index_index * sechdrsize,
+ &index_offset, &index_size);
+ index = XNEWVEC (unsigned char, index_size);
+ if (!simple_object_internal_read (sobj->descriptor,
+ sobj->offset + index_offset,
+ index, index_size,
+ errmsg, err))
+ {
+ XDELETEVEC (index);
+ XDELETEVEC (nametab);
+ XDELETEVEC (secdata);
+ return 0;
+ }
+
+ /* The index contains 4 unsigned ints per sub-section:
+ sub-section offset/length, sub-section name/length.
+ We fix this for both 32 and 64 bit mach-o for now, since
+ other fields limit the maximum size of an object to 4G. */
+ n_wrapped_sects = index_size / 16;
+
+ /* Get the parameters for the wrapper too. */
+ simple_object_mach_o_section_info (omr->is_big_endian, is_32,
+ secdata + sections_index * sechdrsize,
+ &wrapper_sect_offset,
+ &wrapper_sect_size);