- /* Pointer to next in linked list. */
- struct program_space *next;
-
- /* Unique ID number. */
- int num;
-
- /* The main executable loaded into this program space. This is
- managed by the exec target. */
-
- /* The BFD handle for the main executable. */
- bfd *ebfd;
- /* The last-modified time, from when the exec was brought in. */
- long ebfd_mtime;
- /* Similar to bfd_get_filename (exec_bfd) but in original form given
- by user, without symbolic links and pathname resolved.
- It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */
- char *pspace_exec_filename;
-
- /* The address space attached to this program space. More than one
- program space may be bound to the same address space. In the
- traditional unix-like debugging scenario, this will usually
- match the address space bound to the inferior, and is mostly
- used by the breakpoints module for address matches. If the
- target shares a program space for all inferiors and breakpoints
- are global, then this field is ignored (we don't currently
- support inferiors sharing a program space if the target doesn't
- make breakpoints global). */
- struct address_space *aspace;
-
- /* True if this program space's section offsets don't yet represent
- the final offsets of the "live" address space (that is, the
- section addresses still require the relocation offsets to be
- applied, and hence we can't trust the section addresses for
- anything that pokes at live memory). E.g., for qOffsets
- targets, or for PIE executables, until we connect and ask the
- target for the final relocation offsets, the symbols we've used
- to set breakpoints point at the wrong addresses. */
- int executing_startup;
-
- /* True if no breakpoints should be inserted in this program
- space. */
- int breakpoints_not_allowed;
-
- /* The object file that the main symbol table was loaded from
- (e.g. the argument to the "symbol-file" or "file" command). */
- struct objfile *symfile_object_file;
-
- /* All known objfiles are kept in a linked list. This points to
- the head of this list. */
- struct objfile *objfiles;
-
- /* The set of target sections matching the sections mapped into
- this program space. Managed by both exec_ops and solib.c. */
- struct target_section_table target_sections;
-
- /* List of shared objects mapped into this space. Managed by
- solib.c. */
- struct so_list *so_list;
-
- /* Number of calls to solib_add. */
- unsigned solib_add_generation;
-
- /* When an solib is added, it is also added to this vector. This
- is so we can properly report solib changes to the user. */
- VEC (so_list_ptr) *added_solibs;
-
- /* When an solib is removed, its name is added to this vector.
- This is so we can properly report solib changes to the user. */
- VEC (char_ptr) *deleted_solibs;
-
- /* Per pspace data-pointers required by other GDB modules. */
- REGISTRY_FIELDS;
- };
+ return objfiles_safe_range (objfiles_head);
+ }
+
+ /* Add OBJFILE to the list of objfiles, putting it just before
+ BEFORE. If BEFORE is nullptr, it will go at the end of the
+ list. */
+ void add_objfile (struct objfile *objfile, struct objfile *before);
+
+ /* Remove OBJFILE from the list of objfiles. */
+ void remove_objfile (struct objfile *objfile);
+
+ /* Pointer to next in linked list. */
+ struct program_space *next = NULL;
+
+ /* Unique ID number. */
+ int num = 0;
+
+ /* The main executable loaded into this program space. This is
+ managed by the exec target. */
+
+ /* The BFD handle for the main executable. */
+ bfd *ebfd = NULL;
+ /* The last-modified time, from when the exec was brought in. */
+ long ebfd_mtime = 0;
+ /* Similar to bfd_get_filename (exec_bfd) but in original form given
+ by user, without symbolic links and pathname resolved.
+ It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */
+ char *pspace_exec_filename = NULL;
+
+ /* Binary file diddling handle for the core file. */
+ gdb_bfd_ref_ptr cbfd;
+
+ /* The address space attached to this program space. More than one
+ program space may be bound to the same address space. In the
+ traditional unix-like debugging scenario, this will usually
+ match the address space bound to the inferior, and is mostly
+ used by the breakpoints module for address matches. If the
+ target shares a program space for all inferiors and breakpoints
+ are global, then this field is ignored (we don't currently
+ support inferiors sharing a program space if the target doesn't
+ make breakpoints global). */
+ struct address_space *aspace = NULL;
+
+ /* True if this program space's section offsets don't yet represent
+ the final offsets of the "live" address space (that is, the
+ section addresses still require the relocation offsets to be
+ applied, and hence we can't trust the section addresses for
+ anything that pokes at live memory). E.g., for qOffsets
+ targets, or for PIE executables, until we connect and ask the
+ target for the final relocation offsets, the symbols we've used
+ to set breakpoints point at the wrong addresses. */
+ int executing_startup = 0;
+
+ /* True if no breakpoints should be inserted in this program
+ space. */
+ int breakpoints_not_allowed = 0;
+
+ /* The object file that the main symbol table was loaded from
+ (e.g. the argument to the "symbol-file" or "file" command). */
+ struct objfile *symfile_object_file = NULL;
+
+ /* All known objfiles are kept in a linked list. This points to
+ the head of this list. */
+ struct objfile *objfiles_head = NULL;
+
+ /* The set of target sections matching the sections mapped into
+ this program space. Managed by both exec_ops and solib.c. */
+ struct target_section_table target_sections {};
+
+ /* List of shared objects mapped into this space. Managed by
+ solib.c. */
+ struct so_list *so_list = NULL;
+
+ /* Number of calls to solib_add. */
+ unsigned int solib_add_generation = 0;
+
+ /* When an solib is added, it is also added to this vector. This
+ is so we can properly report solib changes to the user. */
+ std::vector<struct so_list *> added_solibs;
+
+ /* When an solib is removed, its name is added to this vector.
+ This is so we can properly report solib changes to the user. */
+ std::vector<std::string> deleted_solibs;
+
+ /* Per pspace data-pointers required by other GDB modules. */
+ REGISTRY_FIELDS {};
+};
+
+/* An address space. It is used for comparing if
+ pspaces/inferior/threads see the same address space and for
+ associating caches to each address space. */
+struct address_space
+{
+ int num;
+
+ /* Per aspace data-pointers required by other GDB modules. */
+ REGISTRY_FIELDS;
+};