aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf-bfd.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2024-03-01 06:14:20 -0800
committerH.J. Lu <hjl.tools@gmail.com>2024-04-03 09:11:03 -0700
commit584b30e4b3538a64d38bc1da9cfa09fc9355378a (patch)
treec5d9e8cd2d6dbc695737abb77a523e86e7e411d7 /bfd/elf-bfd.h
parent9ba56acee518492cfe21434b974c807f52ac7950 (diff)
downloadgdb-584b30e4b3538a64d38bc1da9cfa09fc9355378a.zip
gdb-584b30e4b3538a64d38bc1da9cfa09fc9355378a.tar.gz
gdb-584b30e4b3538a64d38bc1da9cfa09fc9355378a.tar.bz2
elf: Add _bfd_elf_m[un]map_section_contents
Add _bfd_elf_mmap_section_contents and _bfd_elf_munmap_section_contents. A backend must opt-in to use mmap. It should replace bfd_malloc_and_get_section -> _bfd_elf_mmap_section_contents free -> _bfd_elf_munmap_section_contents on section contents. * compress.c (bfd_get_full_section_contents): Don't allocate buffer if mmapped_p is true. * elf-bfd.h (elf_backend_data): Add use_mmap. (bfd_elf_section_data): Add contents_addr and contents_size. (_bfd_elf_mmap_section_contents): New. (_bfd_elf_munmap_section_contents): Likewise. * elf-eh-frame.c (_bfd_elf_parse_eh_frame): Replace bfd_malloc_and_get_section and free with _bfd_elf_mmap_section_contents and _bfd_elf_munmap_section_contents on section contents. * elf-sframe.c (_bfd_elf_parse_sframe): Likewise. * elf.c (_bfd_elf_make_section_from_shdr): Replace bfd_malloc_and_get_section and free with _bfd_elf_mmap_section_contents and _bfd_elf_munmap_section_contents on section contents. (_bfd_elf_print_private_bfd_data): Likewise. (_bfd_elf_mmap_section_contents): New. (_bfd_elf_munmap_section_contents): Likewise. * elf32-i386.c (elf_i386_scan_relocs): Replace bfd_malloc_and_get_section and free with _bfd_elf_mmap_section_contents and _bfd_elf_munmap_section_contents on section contents. * elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise. (elf_x86_64_get_synthetic_symtab): Likewise. * elfcode.h (elf_checksum_contents): Likewise. * elflink.c (elf_link_add_object_symbols): Likewise. (bfd_elf_get_bfd_needed_list): Likewise. * elfxx-target.h (elf_backend_use_mmap): New. (elfNN_bed): Add elf_backend_use_mmap. * elfxx-x86.c (elf_x86_size_or_finish_relative_reloc): Replace bfd_malloc_and_get_section and free with _bfd_elf_mmap_section_contents and _bfd_elf_munmap_section_contents on section contents. (_bfd_x86_elf_get_synthetic_symtab): Replace free with _bfd_elf_munmap_section_contents. * elfxx-x86.h (elf_backend_use_mmap): New. * libbfd.c: Include "elf-bfd.h". (_bfd_generic_get_section_contents): Call bfd_mmap_local for mmapped_p. * opncls.c (_bfd_delete_bfd): Also munmap ELF section contents. * section.c (asection): Add mmapped_p. (BFD_FAKE_SECTION): Updated. (bfd_malloc_and_get_section): Add a sanity check for not mmapped_p. * bfd-in2.h: Regenerated.
Diffstat (limited to 'bfd/elf-bfd.h')
-rw-r--r--bfd/elf-bfd.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 29283f2..01e0da1 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1778,6 +1778,12 @@ struct elf_backend_data
/* True if the 64-bit Linux PRPSINFO structure's `pr_uid' and `pr_gid'
members use a 16-bit data type. */
unsigned linux_prpsinfo64_ugid16 : 1;
+
+ /* True if the backend can use mmap to map in all input section
+ contents. All bfd_malloc_and_get_section and free usages on
+ section contents must be replaced by _bfd_elf_mmap_section_contents
+ and _bfd_elf_munmap_section_contents. */
+ unsigned use_mmap : 1;
};
/* Information about reloc sections associated with a bfd_elf_section_data
@@ -1859,6 +1865,15 @@ struct bfd_elf_section_data
/* Link from a text section to its .eh_frame_entry section. */
asection *eh_frame_entry;
+ /* If the mmapped_p flag is set, this points to the actual mmapped
+ address of contents. If it is set to NULL, contents isn't
+ mmapped. */
+ void *contents_addr;
+
+ /* If the mmapped_p flag is set, this is the actual mmapped size of
+ contents. */
+ size_t contents_size;
+
/* TRUE if the section has secondary reloc sections associated with it.
FIXME: In the future it might be better to change this into a list
of secondary reloc sections, making lookup easier and faster. */
@@ -3127,6 +3142,11 @@ extern bool _bfd_elf_maybe_set_textrel
extern bool _bfd_elf_add_dynamic_tags
(bfd *, struct bfd_link_info *, bool);
+extern bool _bfd_elf_mmap_section_contents
+ (bfd *abfd, asection *section, bfd_byte **buf);
+extern void _bfd_elf_munmap_section_contents
+ (asection *, void *);
+
/* Large common section. */
extern asection _bfd_elf_large_com_section;