+#ifdef CORE_VERSION_1
+ /* AIX 4 adds data sections from loaded objects to the core file,
+ which can be found by examining ldinfo, and anonymously mmapped
+ regions. */
+ {
+ LdInfo ldinfo;
+ bfd_size_type ldi_datasize;
+ file_ptr ldi_core;
+ uint ldi_next;
+ bfd_vma ldi_dataorg;
+ bfd_vma core_dataorg;
+
+ /* Fields from new and old core structures. */
+ bfd_size_type c_datasize, c_vmregions;
+ file_ptr c_data, c_vmm;
+
+ if (CORE_NEW (core))
+ {
+ c_datasize = CNEW_DATASIZE (core.new_dump);
+ c_data = (file_ptr) core.new_dump.c_data;
+ c_vmregions = core.new_dump.c_vmregions;
+ c_vmm = (file_ptr) core.new_dump.c_vmm;
+ }
+#ifndef BFD64
+ else
+ {
+ c_datasize = core.old.c_datasize;
+ c_data = (file_ptr) (ptr_to_uint) core.old.c_data;
+ c_vmregions = core.old.c_vmregions;
+ c_vmm = (file_ptr) (ptr_to_uint) core.old.c_vmm;
+ }
+#endif
+
+ /* .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
+
+ if (vminfo_offset)
+ if (!make_bfd_asection (abfd, ".vmdata",
+ SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
+ vminfo_size, vminfo_addr,
+ vminfo_offset))
+ goto fail;
+ }
+ }
+ }
+#endif