gdb: use bfd_get_section_contents to read section contents in is_linked_with_cygwin_dll
The function is_linked_with_cygwin_dll currently uses gdb_bfd_map_section to get some section contents. This is not ideal because that memory, which is only used in this function, can't be released. Instead, it was suggested to use bfd_get_full_section_contents. However, bfd_get_full_section_contents returns a newly allocated buffer, which is not very practical to use with C++ automatic memory management constructs. I decided to make gdb_bfd_get_full_section_contents, a small alternative to bfd_get_full_section_contents. It is a small wrapper around bfd_get_section_contents which returns the full contents of the section in a gdb::byte_vector. gdb_bfd_get_full_section_contents could be used at many places that already allocate a vector of the size of the section and then call bfd_get_section_contents. I think these call sites can be updated over time. gdb/ChangeLog: * gdb_bfd.h: Include gdbsupport/byte-vector.h. (gdb_bfd_get_full_section_contents): New declaration. * gdb_bfd.c (gdb_bfd_get_full_section_contents): New function. * windows-tdep.c (is_linked_with_cygwin_dll): Use gdb_bfd_get_full_section_contents.
This commit is contained in:
parent
e2ff18a0a5
commit
e0fc5c3fcb
@ -1,3 +1,11 @@
|
|||||||
|
2020-04-02 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
|
* gdb_bfd.h: Include gdbsupport/byte-vector.h.
|
||||||
|
(gdb_bfd_get_full_section_contents): New declaration.
|
||||||
|
* gdb_bfd.c (gdb_bfd_get_full_section_contents): New function.
|
||||||
|
* windows-tdep.c (is_linked_with_cygwin_dll): Use
|
||||||
|
gdb_bfd_get_full_section_contents.
|
||||||
|
|
||||||
2020-04-02 Simon Marchi <simon.marchi@polymtl.ca>
|
2020-04-02 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* exec.c (build_section_table): Replace internal_error with
|
* exec.c (build_section_table): Replace internal_error with
|
||||||
|
@ -926,7 +926,19 @@ gdb_bfd_requires_relocations (bfd *abfd)
|
|||||||
return gdata->needs_relocations;
|
return gdata->needs_relocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See gdb_bfd.h. */
|
||||||
|
|
||||||
|
bool
|
||||||
|
gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
|
||||||
|
gdb::byte_vector *contents)
|
||||||
|
{
|
||||||
|
bfd_size_type section_size = bfd_section_size (section);
|
||||||
|
|
||||||
|
contents->resize (section_size);
|
||||||
|
|
||||||
|
return bfd_get_section_contents (abfd, section, contents->data (), 0,
|
||||||
|
section_size);
|
||||||
|
}
|
||||||
|
|
||||||
/* A callback for htab_traverse that prints a single BFD. */
|
/* A callback for htab_traverse that prints a single BFD. */
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define GDB_BFD_H
|
#define GDB_BFD_H
|
||||||
|
|
||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
|
#include "gdbsupport/byte-vector.h"
|
||||||
#include "gdbsupport/gdb_ref_ptr.h"
|
#include "gdbsupport/gdb_ref_ptr.h"
|
||||||
|
|
||||||
DECLARE_REGISTRY (bfd);
|
DECLARE_REGISTRY (bfd);
|
||||||
@ -181,4 +182,12 @@ int gdb_bfd_count_sections (bfd *abfd);
|
|||||||
|
|
||||||
int gdb_bfd_requires_relocations (bfd *abfd);
|
int gdb_bfd_requires_relocations (bfd *abfd);
|
||||||
|
|
||||||
|
/* Alternative to bfd_get_full_section_contents that returns the section
|
||||||
|
contents in *CONTENTS, instead of an allocated buffer.
|
||||||
|
|
||||||
|
Return true on success, false otherwise. */
|
||||||
|
|
||||||
|
bool gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
|
||||||
|
gdb::byte_vector *contents);
|
||||||
|
|
||||||
#endif /* GDB_BFD_H */
|
#endif /* GDB_BFD_H */
|
||||||
|
@ -935,18 +935,17 @@ is_linked_with_cygwin_dll (bfd *abfd)
|
|||||||
bfd_vma idata_addr
|
bfd_vma idata_addr
|
||||||
= pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
|
= pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
|
||||||
|
|
||||||
/* Map the section's data. */
|
/* Get the section's data. */
|
||||||
bfd_size_type idata_size;
|
gdb::byte_vector idata_contents;
|
||||||
const gdb_byte *const idata_contents
|
if (!gdb_bfd_get_full_section_contents (abfd, idata_section, &idata_contents))
|
||||||
= gdb_bfd_map_section (idata_section, &idata_size);
|
|
||||||
if (idata_contents == nullptr)
|
|
||||||
{
|
{
|
||||||
warning (_("Failed to get content of .idata section."));
|
warning (_("Failed to get content of .idata section."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const gdb_byte *iter = idata_contents;
|
size_t idata_size = idata_contents.size ();
|
||||||
const gdb_byte *end = idata_contents + idata_size;
|
const gdb_byte *iter = idata_contents.data ();
|
||||||
|
const gdb_byte *end = idata_contents.data () + idata_size;
|
||||||
const pe_import_directory_entry null_dir_entry = { 0 };
|
const pe_import_directory_entry null_dir_entry = { 0 };
|
||||||
|
|
||||||
/* Iterate through all directory entries. */
|
/* Iterate through all directory entries. */
|
||||||
|
Loading…
Reference in New Issue
Block a user