+ /* .data section from executable. */
+ if (c_datasize)
+ {
+ /* If Large Memory Model is used, then the .data segment should start from
+ BDATAORG which has been defined in the system header files. */
+
+ if (c_flag & CORE_BIGDATA)
+ core_dataorg = BDATAORG;
+ else
+ core_dataorg = CDATA_ADDR (c_datasize);
+
+ if (!make_bfd_asection (abfd, ".data",
+ SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
+ c_datasize,
+ (bfd_vma) core_dataorg,
+ c_data))
+ goto fail;
+ }
+
+ /* .data sections from loaded objects. */
+ if (proc64)
+ size = (unsigned long) ((LdInfo *) 0)->l64.ldinfo_filename;
+ else
+ size = (unsigned long) ((LdInfo *) 0)->l32.ldinfo_filename;
+
+ while (1)
+ {
+ if (bfd_seek (abfd, c_loader, SEEK_SET) != 0)
+ goto fail;
+ if (bfd_bread (&ldinfo, size, abfd) != size)
+ goto fail;
+
+ if (proc64)
+ {
+ ldi_core = ldinfo.l64.ldinfo_core;
+ ldi_datasize = ldinfo.l64.ldinfo_datasize;
+ ldi_dataorg = (bfd_vma) ldinfo.l64.ldinfo_dataorg;
+ ldi_next = ldinfo.l64.ldinfo_next;
+ }
+ else
+ {
+ ldi_core = ldinfo.l32.ldinfo_core;
+ ldi_datasize = ldinfo.l32.ldinfo_datasize;
+ ldi_dataorg = (bfd_vma) (ptr_to_uint) ldinfo.l32.ldinfo_dataorg;
+ ldi_next = ldinfo.l32.ldinfo_next;
+ }
+
+ if (ldi_core)
+ if (!make_bfd_asection (abfd, ".data",
+ SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
+ ldi_datasize, ldi_dataorg, ldi_core))
+ goto fail;
+
+ if (ldi_next == 0)
+ break;
+ c_loader += ldi_next;
+ }
+
+ /* .vmdata sections from anonymously mmapped regions. */
+ if (c_vmregions)
+ {
+ bfd_size_type i;
+
+ if (bfd_seek (abfd, c_vmm, SEEK_SET) != 0)
+ goto fail;
+
+ for (i = 0; i < c_vmregions; i++)
+ {
+ VmInfo vminfo;
+ bfd_size_type vminfo_size;
+ file_ptr vminfo_offset;
+ bfd_vma vminfo_addr;
+
+#ifndef BFD64
+ size = CORE_NEW (core) ? sizeof (vminfo.new_dump) : sizeof (vminfo.old);
+#else
+ size = sizeof (vminfo.new_dump);
+#endif
+ if (bfd_bread (&vminfo, size, abfd) != size)
+ goto fail;
+
+ if (CORE_NEW (core))
+ {
+ vminfo_addr = (bfd_vma) vminfo.new_dump.vminfo_addr;
+ vminfo_size = vminfo.new_dump.vminfo_size;
+ vminfo_offset = vminfo.new_dump.vminfo_offset;
+ }
+#ifndef BFD64
+ else
+ {
+ vminfo_addr = (bfd_vma) (ptr_to_uint) vminfo.old.vminfo_addr;
+ vminfo_size = vminfo.old.vminfo_size;
+ vminfo_offset = vminfo.old.vminfo_offset;
+ }
+#endif