]>
Commit | Line | Data |
---|---|---|
13437d4b | 1 | /* Shared library declarations for GDB, the GNU Debugger. |
1d506c26 | 2 | Copyright (C) 1990-2024 Free Software Foundation, Inc. |
13437d4b KB |
3 | |
4 | This file is part of GDB. | |
5 | ||
6 | This program is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
a9762ec7 | 8 | the Free Software Foundation; either version 3 of the License, or |
13437d4b KB |
9 | (at your option) any later version. |
10 | ||
11 | This program is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
a9762ec7 | 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
13437d4b | 18 | |
17732724 AC |
19 | #ifndef SOLIST_H |
20 | #define SOLIST_H | |
21 | ||
13437d4b | 22 | #define SO_NAME_MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */ |
3a40aaa0 UW |
23 | /* For domain_enum domain. */ |
24 | #include "symtab.h" | |
192b62ce | 25 | #include "gdb_bfd.h" |
bb2a6777 | 26 | #include "target-section.h" |
13437d4b | 27 | |
d0e449a1 SM |
28 | /* Base class for target-specific link map information. */ |
29 | ||
ae4bf244 | 30 | struct lm_info |
d0e449a1 | 31 | { |
e3b63a79 SM |
32 | lm_info () = default; |
33 | lm_info (const lm_info &) = default; | |
34 | virtual ~lm_info () = 0; | |
d0e449a1 | 35 | }; |
13437d4b | 36 | |
7ad0a42e SM |
37 | using lm_info_up = std::unique_ptr<lm_info>; |
38 | ||
3fe0dfd1 | 39 | struct shobj : intrusive_list_node<shobj> |
dd33d41d | 40 | { |
4ac91b6b SM |
41 | /* Free symbol-file related contents of SO and reset for possible reloading |
42 | of SO. If we have opened a BFD for SO, close it. If we have placed SO's | |
43 | sections in some target's section table, the caller is responsible for | |
44 | removing them. | |
45 | ||
46 | This function doesn't mess with objfiles at all. If there is an | |
47 | objfile associated with SO that needs to be removed, the caller is | |
48 | responsible for taking care of that. */ | |
49 | void clear () ; | |
50 | ||
dd33d41d SM |
51 | /* The following fields of the structure come directly from the |
52 | dynamic linker's tables in the inferior, and are initialized by | |
53 | current_sos. */ | |
54 | ||
dd33d41d SM |
55 | /* A pointer to target specific link map information. Often this |
56 | will be a copy of struct link_map from the user process, but | |
57 | it need not be; it can be any collection of data needed to | |
58 | traverse the dynamic linker's data structures. */ | |
7ad0a42e | 59 | lm_info_up lm_info; |
dd33d41d SM |
60 | |
61 | /* Shared object file name, exactly as it appears in the | |
62 | inferior's link map. This may be a relative path, or something | |
63 | which needs to be looked up in LD_LIBRARY_PATH, etc. We use it | |
64 | to tell which entries in the inferior's dynamic linker's link | |
65 | map we've already loaded. */ | |
98107b0b | 66 | std::string so_original_name; |
dd33d41d SM |
67 | |
68 | /* Shared object file name, expanded to something GDB can open. */ | |
98107b0b | 69 | std::string so_name; |
dd33d41d | 70 | |
dd33d41d SM |
71 | /* The following fields of the structure are built from |
72 | information gathered from the shared object file itself, and | |
73 | are set when we actually add it to our symbol tables. | |
74 | ||
75 | current_sos must initialize these fields to 0. */ | |
76 | ||
200b8563 | 77 | gdb_bfd_ref_ptr abfd; |
94d5c648 | 78 | char symbols_loaded = 0; /* flag: symbols read in yet? */ |
dd33d41d SM |
79 | |
80 | /* objfile with symbols for a loaded library. Target memory is read from | |
81 | ABFD. OBJFILE may be NULL either before symbols have been loaded, if | |
82 | the file cannot be found or after the command "nosharedlibrary". */ | |
94d5c648 | 83 | struct objfile *objfile = nullptr; |
dd33d41d | 84 | |
ae19ef71 | 85 | std::vector<target_section> sections; |
dd33d41d SM |
86 | |
87 | /* Record the range of addresses belonging to this shared library. | |
88 | There may not be just one (e.g. if two segments are relocated | |
89 | differently). This is used for "info sharedlibrary" and | |
90 | the MI command "-file-list-shared-libraries". The latter has a format | |
91 | that supports outputting multiple segments once the related code | |
92 | supports them. */ | |
94d5c648 | 93 | CORE_ADDR addr_low = 0, addr_high = 0; |
dd33d41d | 94 | }; |
13437d4b KB |
95 | |
96 | struct target_so_ops | |
dd33d41d SM |
97 | { |
98 | /* Adjust the section binding addresses by the base address at | |
99 | which the object was actually mapped. */ | |
3fe0dfd1 | 100 | void (*relocate_section_addresses) (shobj &so, target_section *); |
dd33d41d | 101 | |
dd33d41d SM |
102 | /* Reset private data structures associated with SO. |
103 | This is called when SO is about to be reloaded. | |
e3b63a79 | 104 | It is also called when SO is about to be freed. */ |
3fe0dfd1 | 105 | void (*clear_so) (const shobj &so); |
dd33d41d | 106 | |
581b34c2 SM |
107 | /* Free private data structures associated to PSPACE. This method |
108 | should not free resources associated to individual so_list entries, | |
109 | those are cleared by the clear_so method. */ | |
110 | void (*clear_solib) (program_space *pspace); | |
dd33d41d SM |
111 | |
112 | /* Target dependent code to run after child process fork. */ | |
113 | void (*solib_create_inferior_hook) (int from_tty); | |
114 | ||
115 | /* Construct a list of the currently loaded shared objects. This | |
116 | list does not include an entry for the main executable file. | |
117 | ||
118 | Note that we only gather information directly available from the | |
119 | inferior --- we don't examine any of the shared library files | |
3fe0dfd1 | 120 | themselves. The declaration of `struct shobj' says which fields |
dd33d41d | 121 | we provide values for. */ |
3fe0dfd1 | 122 | intrusive_list<shobj> (*current_sos) (); |
dd33d41d SM |
123 | |
124 | /* Find, open, and read the symbols for the main executable. If | |
125 | FROM_TTY is non-zero, allow messages to be printed. */ | |
126 | int (*open_symbol_file_object) (int from_ttyp); | |
127 | ||
128 | /* Determine if PC lies in the dynamic symbol resolution code of | |
129 | the run time loader. */ | |
130 | int (*in_dynsym_resolve_code) (CORE_ADDR pc); | |
131 | ||
132 | /* Find and open shared library binary file. */ | |
133 | gdb_bfd_ref_ptr (*bfd_open) (const char *pathname); | |
134 | ||
135 | /* Optional extra hook for finding and opening a solib. | |
136 | If TEMP_PATHNAME is non-NULL: If the file is successfully opened a | |
137 | pointer to a malloc'd and realpath'd copy of SONAME is stored there, | |
138 | otherwise NULL is stored there. */ | |
139 | int (*find_and_open_solib) (const char *soname, | |
140 | unsigned o_flags, | |
141 | gdb::unique_xmalloc_ptr<char> *temp_pathname); | |
142 | ||
dd33d41d SM |
143 | /* Given two so_list objects, one from the GDB thread list |
144 | and another from the list returned by current_sos, return 1 | |
145 | if they represent the same library. | |
146 | Falls back to using strcmp on so_original_name field when set | |
147 | to NULL. */ | |
3fe0dfd1 | 148 | int (*same) (const shobj &gdb, const shobj &inferior); |
dd33d41d SM |
149 | |
150 | /* Return whether a region of memory must be kept in a core file | |
151 | for shared libraries loaded before "gcore" is used to be | |
152 | handled correctly when the core file is loaded. This only | |
153 | applies when the section would otherwise not be kept in the | |
154 | core file (in particular, for readonly sections). */ | |
155 | int (*keep_data_in_core) (CORE_ADDR vaddr, | |
156 | unsigned long size); | |
157 | ||
158 | /* Enable or disable optional solib event breakpoints as | |
159 | appropriate. This should be called whenever | |
160 | stop_on_solib_events is changed. This pointer can be | |
161 | NULL, in which case no enabling or disabling is necessary | |
162 | for this target. */ | |
163 | void (*update_breakpoints) (void); | |
164 | ||
165 | /* Target-specific processing of solib events that will be | |
166 | performed before solib_add is called. This pointer can be | |
167 | NULL, in which case no specific preprocessing is necessary | |
168 | for this target. */ | |
169 | void (*handle_event) (void); | |
170 | }; | |
13437d4b | 171 | |
b3bc8453 | 172 | /* A unique pointer to a so_list. */ |
3fe0dfd1 | 173 | using shobj_up = std::unique_ptr<shobj>; |
b3bc8453 | 174 | |
af1900b0 | 175 | /* Find main executable binary file. */ |
797bc1cb TT |
176 | extern gdb::unique_xmalloc_ptr<char> exec_file_find (const char *in_pathname, |
177 | int *fd); | |
af1900b0 | 178 | |
572d275c | 179 | /* Find shared library binary file. */ |
797bc1cb TT |
180 | extern gdb::unique_xmalloc_ptr<char> solib_find (const char *in_pathname, |
181 | int *fd); | |
572d275c UW |
182 | |
183 | /* Open BFD for shared library file. */ | |
797bc1cb | 184 | extern gdb_bfd_ref_ptr solib_bfd_fopen (const char *pathname, int fd); |
572d275c | 185 | |
e4f7b8c8 | 186 | /* Find solib binary file and open it. */ |
692d6f97 | 187 | extern gdb_bfd_ref_ptr solib_bfd_open (const char *in_pathname); |
e4f7b8c8 | 188 | |
17732724 | 189 | #endif |