X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsolist.h;h=068aeba2f0ecaccf9b3edff436cff4f2b46c652b;hb=57d87c09a33acdce280f4c9ae4f55b885a5cee99;hp=948ad314ff99ab267391ca116f7647e7cd8472b5;hpb=992f1ddc3be1f5195f18beaa801ac50f284b10c5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solist.h b/gdb/solist.h index 948ad314ff..068aeba2f0 100644 --- a/gdb/solist.h +++ b/gdb/solist.h @@ -1,5 +1,5 @@ /* Shared library declarations for GDB, the GNU Debugger. - Copyright (C) 1990-2016 Free Software Foundation, Inc. + Copyright (C) 1990-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,173 +22,185 @@ #define SO_NAME_MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */ /* For domain_enum domain. */ #include "symtab.h" +#include "gdb_bfd.h" -/* Forward declaration for target specific link map information. This - struct is opaque to all but the target specific file. */ -struct lm_info; +#define ALL_SO_LIBS(so) \ + for (so = so_list_head; \ + so != NULL; \ + so = so->next) -struct so_list - { - /* The following fields of the structure come directly from the - dynamic linker's tables in the inferior, and are initialized by - current_sos. */ - - struct so_list *next; /* next structure in linked list */ - - /* A pointer to target specific link map information. Often this - will be a copy of struct link_map from the user process, but - it need not be; it can be any collection of data needed to - traverse the dynamic linker's data structures. */ - struct lm_info *lm_info; - - /* Shared object file name, exactly as it appears in the - inferior's link map. This may be a relative path, or something - which needs to be looked up in LD_LIBRARY_PATH, etc. We use it - to tell which entries in the inferior's dynamic linker's link - map we've already loaded. */ - char so_original_name[SO_NAME_MAX_PATH_SIZE]; - - /* Shared object file name, expanded to something GDB can open. */ - char so_name[SO_NAME_MAX_PATH_SIZE]; - - /* Program space this shared library belongs to. */ - struct program_space *pspace; - - /* The following fields of the structure are built from - information gathered from the shared object file itself, and - are set when we actually add it to our symbol tables. - - current_sos must initialize these fields to 0. */ +/* Base class for target-specific link map information. */ - bfd *abfd; - char symbols_loaded; /* flag: symbols read in yet? */ +struct lm_info_base +{ +}; - /* objfile with symbols for a loaded library. Target memory is read from - ABFD. OBJFILE may be NULL either before symbols have been loaded, if - the file cannot be found or after the command "nosharedlibrary". */ - struct objfile *objfile; - - struct target_section *sections; - struct target_section *sections_end; - - /* Record the range of addresses belonging to this shared library. - There may not be just one (e.g. if two segments are relocated - differently); but this is only used for "info sharedlibrary". */ - CORE_ADDR addr_low, addr_high; - }; +struct so_list +{ + /* The following fields of the structure come directly from the + dynamic linker's tables in the inferior, and are initialized by + current_sos. */ + + struct so_list *next; /* next structure in linked list */ + + /* A pointer to target specific link map information. Often this + will be a copy of struct link_map from the user process, but + it need not be; it can be any collection of data needed to + traverse the dynamic linker's data structures. */ + lm_info_base *lm_info; + + /* Shared object file name, exactly as it appears in the + inferior's link map. This may be a relative path, or something + which needs to be looked up in LD_LIBRARY_PATH, etc. We use it + to tell which entries in the inferior's dynamic linker's link + map we've already loaded. */ + char so_original_name[SO_NAME_MAX_PATH_SIZE]; + + /* Shared object file name, expanded to something GDB can open. */ + char so_name[SO_NAME_MAX_PATH_SIZE]; + + /* Program space this shared library belongs to. */ + struct program_space *pspace; + + /* The following fields of the structure are built from + information gathered from the shared object file itself, and + are set when we actually add it to our symbol tables. + + current_sos must initialize these fields to 0. */ + + bfd *abfd; + char symbols_loaded; /* flag: symbols read in yet? */ + + /* objfile with symbols for a loaded library. Target memory is read from + ABFD. OBJFILE may be NULL either before symbols have been loaded, if + the file cannot be found or after the command "nosharedlibrary". */ + struct objfile *objfile; + + struct target_section *sections; + struct target_section *sections_end; + + /* Record the range of addresses belonging to this shared library. + There may not be just one (e.g. if two segments are relocated + differently). This is used for "info sharedlibrary" and + the MI command "-file-list-shared-libraries". The latter has a format + that supports outputting multiple segments once the related code + supports them. */ + CORE_ADDR addr_low, addr_high; +}; struct target_so_ops - { - /* Adjust the section binding addresses by the base address at - which the object was actually mapped. */ - void (*relocate_section_addresses) (struct so_list *so, - struct target_section *); - - /* Free the link map info and any other private data structures - associated with a so_list entry. */ - void (*free_so) (struct so_list *so); - - /* Reset private data structures associated with SO. - This is called when SO is about to be reloaded. - It is also called before free_so when SO is about to be freed. */ - void (*clear_so) (struct so_list *so); - - /* Reset or free private data structures not associated with - so_list entries. */ - void (*clear_solib) (void); - - /* Target dependent code to run after child process fork. */ - void (*solib_create_inferior_hook) (int from_tty); - - /* Construct a list of the currently loaded shared objects. This - list does not include an entry for the main executable file. - - Note that we only gather information directly available from the - inferior --- we don't examine any of the shared library files - themselves. The declaration of `struct so_list' says which fields - we provide values for. */ - struct so_list *(*current_sos) (void); - - /* Find, open, and read the symbols for the main executable. If - FROM_TTYP dereferences to a non-zero integer, allow messages to - be printed. This parameter is a pointer rather than an int - because open_symbol_file_object is called via catch_errors and - catch_errors requires a pointer argument. */ - int (*open_symbol_file_object) (void *from_ttyp); - - /* Determine if PC lies in the dynamic symbol resolution code of - the run time loader. */ - int (*in_dynsym_resolve_code) (CORE_ADDR pc); - - /* Find and open shared library binary file. */ - bfd *(*bfd_open) (char *pathname); - - /* Optional extra hook for finding and opening a solib. - If TEMP_PATHNAME is non-NULL: If the file is successfully opened a - pointer to a malloc'd and realpath'd copy of SONAME is stored there, - otherwise NULL is stored there. */ - int (*find_and_open_solib) (const char *soname, - unsigned o_flags, char **temp_pathname); - - /* Hook for looking up global symbols in a library-specific way. */ - struct block_symbol (*lookup_lib_global_symbol) - (struct objfile *objfile, - const char *name, - const domain_enum domain); - - /* Given two so_list objects, one from the GDB thread list - and another from the list returned by current_sos, return 1 - if they represent the same library. - Falls back to using strcmp on so_original_name field when set - to NULL. */ - int (*same) (struct so_list *gdb, struct so_list *inferior); - - /* Return whether a region of memory must be kept in a core file - for shared libraries loaded before "gcore" is used to be - handled correctly when the core file is loaded. This only - applies when the section would otherwise not be kept in the - core file (in particular, for readonly sections). */ - int (*keep_data_in_core) (CORE_ADDR vaddr, - unsigned long size); - - /* Enable or disable optional solib event breakpoints as - appropriate. This should be called whenever - stop_on_solib_events is changed. This pointer can be - NULL, in which case no enabling or disabling is necessary - for this target. */ - void (*update_breakpoints) (void); - - /* Target-specific processing of solib events that will be - performed before solib_add is called. This pointer can be - NULL, in which case no specific preprocessing is necessary - for this target. */ - void (*handle_event) (void); - }; +{ + /* Adjust the section binding addresses by the base address at + which the object was actually mapped. */ + void (*relocate_section_addresses) (struct so_list *so, + struct target_section *); + + /* Free the link map info and any other private data structures + associated with a so_list entry. */ + void (*free_so) (struct so_list *so); + + /* Reset private data structures associated with SO. + This is called when SO is about to be reloaded. + It is also called before free_so when SO is about to be freed. */ + void (*clear_so) (struct so_list *so); + + /* Reset or free private data structures not associated with + so_list entries. */ + void (*clear_solib) (void); + + /* Target dependent code to run after child process fork. */ + void (*solib_create_inferior_hook) (int from_tty); + + /* Construct a list of the currently loaded shared objects. This + list does not include an entry for the main executable file. + + Note that we only gather information directly available from the + inferior --- we don't examine any of the shared library files + themselves. The declaration of `struct so_list' says which fields + we provide values for. */ + struct so_list *(*current_sos) (void); + + /* Find, open, and read the symbols for the main executable. If + FROM_TTY is non-zero, allow messages to be printed. */ + int (*open_symbol_file_object) (int from_ttyp); + + /* Determine if PC lies in the dynamic symbol resolution code of + the run time loader. */ + int (*in_dynsym_resolve_code) (CORE_ADDR pc); + + /* Find and open shared library binary file. */ + gdb_bfd_ref_ptr (*bfd_open) (const char *pathname); + + /* Optional extra hook for finding and opening a solib. + If TEMP_PATHNAME is non-NULL: If the file is successfully opened a + pointer to a malloc'd and realpath'd copy of SONAME is stored there, + otherwise NULL is stored there. */ + int (*find_and_open_solib) (const char *soname, + unsigned o_flags, + gdb::unique_xmalloc_ptr *temp_pathname); + + /* Given two so_list objects, one from the GDB thread list + and another from the list returned by current_sos, return 1 + if they represent the same library. + Falls back to using strcmp on so_original_name field when set + to NULL. */ + int (*same) (struct so_list *gdb, struct so_list *inferior); + + /* Return whether a region of memory must be kept in a core file + for shared libraries loaded before "gcore" is used to be + handled correctly when the core file is loaded. This only + applies when the section would otherwise not be kept in the + core file (in particular, for readonly sections). */ + int (*keep_data_in_core) (CORE_ADDR vaddr, + unsigned long size); + + /* Enable or disable optional solib event breakpoints as + appropriate. This should be called whenever + stop_on_solib_events is changed. This pointer can be + NULL, in which case no enabling or disabling is necessary + for this target. */ + void (*update_breakpoints) (void); + + /* Target-specific processing of solib events that will be + performed before solib_add is called. This pointer can be + NULL, in which case no specific preprocessing is necessary + for this target. */ + void (*handle_event) (void); +}; /* Free the memory associated with a (so_list *). */ void free_so (struct so_list *so); +/* A deleter that calls free_so. */ +struct so_deleter +{ + void operator() (struct so_list *so) const + { + free_so (so); + } +}; + +/* A unique pointer to a so_list. */ +typedef std::unique_ptr so_list_up; + /* Return address of first so_list entry in master shared object list. */ struct so_list *master_so_list (void); /* Find main executable binary file. */ -extern char *exec_file_find (const char *in_pathname, int *fd); +extern gdb::unique_xmalloc_ptr exec_file_find (const char *in_pathname, + int *fd); /* Find shared library binary file. */ -extern char *solib_find (const char *in_pathname, int *fd); +extern gdb::unique_xmalloc_ptr solib_find (const char *in_pathname, + int *fd); /* Open BFD for shared library file. */ -extern bfd *solib_bfd_fopen (char *pathname, int fd); +extern gdb_bfd_ref_ptr solib_bfd_fopen (const char *pathname, int fd); /* Find solib binary file and open it. */ -extern bfd *solib_bfd_open (char *in_pathname); +extern gdb_bfd_ref_ptr solib_bfd_open (const char *in_pathname); /* FIXME: gdbarch needs to control this variable. */ extern struct target_so_ops *current_target_so_ops; -/* Handler for library-specific global symbol lookup in solib.c. */ -struct block_symbol solib_global_lookup (struct objfile *objfile, - const char *name, - const domain_enum domain); - #endif