2003-10-08 Roland McGrath <roland@redhat.com>

* gcore.c (make_mem_sec): Function removed, folded into ...
	(gcore_create_callback): ... here.  To omit a section, clear its
	SEC_LOAD bit rather than zeroing its size.
	Omit read-only sections only if they correspond to a known disk file.
	(gcore_copy_callback): Ignore sections without SEC_LOAD flag set.
This commit is contained in:
Roland McGrath 2003-10-11 01:56:53 +00:00
parent cb227dc0c2
commit cbb83bd1ee

View file

@ -306,47 +306,47 @@ make_output_phdrs (bfd *obfd, asection *osec, void *ignored)
bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec);
}
static asection *
make_mem_sec (bfd *obfd, bfd_vma addr, bfd_size_type size,
unsigned int flags, unsigned int alignment)
{
asection *osec;
osec = bfd_make_section_anyway (obfd, "load");
if (osec == NULL)
{
warning ("Couldn't make gcore segment: %s",
bfd_errmsg (bfd_get_error ()));
return NULL;
}
if (info_verbose)
{
fprintf_filtered (gdb_stdout, "Save segment, %lld bytes at 0x%s\n",
(long long) size, paddr_nz (addr));
}
bfd_set_section_size (obfd, osec, size);
bfd_set_section_vma (obfd, osec, addr);
bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma? */
bfd_set_section_alignment (obfd, osec, alignment);
bfd_set_section_flags (obfd, osec,
flags | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS);
return osec;
}
static int
gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
int read, int write, int exec, void *data)
{
flagword flags = 0;
bfd *obfd = data;
asection *osec;
flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD;
if (write == 0)
{
/* See if this region of memory lies inside a known file on disk.
If so, we can avoid copying its contents by clearing SEC_LOAD. */
struct objfile *objfile;
struct obj_section *objsec;
ALL_OBJSECTIONS (objfile, objsec)
{
bfd *abfd = objfile->obfd;
asection *asec = objsec->the_bfd_section;
bfd_vma align = (bfd_vma) 1 << bfd_get_section_alignment (abfd,
asec);
bfd_vma start = objsec->addr & -align;
bfd_vma end = (objsec->endaddr + align - 1) & -align;
/* Match if either the entire memory region lies inside the
section (i.e. a mapping covering some pages of a large
segment) or the entire section lies inside the memory region
(i.e. a mapping covering multiple small sections).
This BFD was synthesized from reading target memory,
we don't want to omit that. */
if (((vaddr >= start && vaddr + size <= end)
|| (start >= vaddr && end <= vaddr + size))
&& !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
{
flags &= ~SEC_LOAD;
goto keep; /* break out of two nested for loops */
}
}
keep:
flags |= SEC_READONLY;
/* Mark readonly sections as zero-sized, such that we can avoid
copying their contents. */
size = 0;
}
if (exec)
@ -354,7 +354,25 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
else
flags |= SEC_DATA;
return ((make_mem_sec (data, vaddr, size, flags, 0)) == NULL);
osec = bfd_make_section_anyway (obfd, "load");
if (osec == NULL)
{
warning ("Couldn't make gcore segment: %s",
bfd_errmsg (bfd_get_error ()));
return 1;
}
if (info_verbose)
{
fprintf_filtered (gdb_stdout, "Save segment, %lld bytes at 0x%s\n",
(long long) size, paddr_nz (vaddr));
}
bfd_set_section_size (obfd, osec, size);
bfd_set_section_vma (obfd, osec, vaddr);
bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma? */
bfd_set_section_flags (obfd, osec, flags);
return 0;
}
static int
@ -416,9 +434,8 @@ gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
struct cleanup *old_chain = NULL;
void *memhunk;
/* Read-only sections are marked as zero-size. We don't have to
copy their contents. */
if (size == 0)
/* Read-only sections are marked; we don't have to copy their contents. */
if ((bfd_get_section_flags (obfd, osec) & SEC_LOAD) == 0)
return;
/* Only interested in "load" sections. */