diff options
Diffstat (limited to 'gdb/testsuite/gdb.base/sym-file-loader.c')
-rw-r--r-- | gdb/testsuite/gdb.base/sym-file-loader.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/sym-file-loader.c b/gdb/testsuite/gdb.base/sym-file-loader.c index d10065e..0b0039d 100644 --- a/gdb/testsuite/gdb.base/sym-file-loader.c +++ b/gdb/testsuite/gdb.base/sym-file-loader.c @@ -60,6 +60,7 @@ sizeof ((hdr)->field) == sizeof (Elf_Addr) ? *(Elf_Addr *) (hdr)->field : \ struct segment { uint8_t *mapped_addr; + size_t mapped_size; Elf_External_Phdr *phdr; struct segment *next; }; @@ -101,6 +102,7 @@ load (uint8_t *addr, Elf_External_Phdr *phdr, struct segment *tail_seg) { struct segment *seg = NULL; uint8_t *mapped_addr = NULL; + size_t mapped_size = 0; void *from = NULL; void *to = NULL; @@ -110,6 +112,7 @@ load (uint8_t *addr, Elf_External_Phdr *phdr, struct segment *tail_seg) mapped_addr = (uint8_t *) mmap ((void *) GETADDR (phdr, p_vaddr), GET (phdr, p_memsz), perm, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + mapped_size = GET (phdr, p_memsz); from = (void *) (addr + GET (phdr, p_offset)); to = (void *) mapped_addr; @@ -122,6 +125,7 @@ load (uint8_t *addr, Elf_External_Phdr *phdr, struct segment *tail_seg) return 0; seg->mapped_addr = mapped_addr; + seg->mapped_size = mapped_size; seg->phdr = phdr; seg->next = 0; @@ -173,6 +177,30 @@ get_origin (void) return self_path; } +/* Unload/unmap a segment. */ + +static void +unload (struct segment *seg) +{ + munmap (seg->mapped_addr, seg->mapped_size); + free (seg); +} + +void +unload_shlib (struct library *lib) +{ + struct segment *seg, *next_seg; + + for (seg = lib->segments; seg != NULL; seg = next_seg) + { + next_seg = seg->next; + unload (seg); + } + + close (lib->fd); + free (lib); +} + /* Mini shared library loader. No reallocation is performed for the sake of simplicity. */ |