addr2line.c: no need to keep fd around after mmap
POSIX mmap(3) manpage stipulates mmap bumps the reference count of the file description. Thus keeping a file descriptor to maintain the reference is not necessary. If this didn't work, every extension .so would require a permanent FD, which is obviously not the case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63908 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e1a8d281eb
commit
0528838b37
@ -119,7 +119,6 @@ typedef struct {
|
|||||||
typedef struct obj_info obj_info_t;
|
typedef struct obj_info obj_info_t;
|
||||||
struct obj_info {
|
struct obj_info {
|
||||||
const char *path; /* object path */
|
const char *path; /* object path */
|
||||||
int fd;
|
|
||||||
void *mapped;
|
void *mapped;
|
||||||
size_t mapped_size;
|
size_t mapped_size;
|
||||||
uintptr_t base_addr;
|
uintptr_t base_addr;
|
||||||
@ -525,6 +524,7 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
|
|||||||
kprintf("mmap: %s\n", strerror(e));
|
kprintf("mmap: %s\n", strerror(e));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
ehdr = (ElfW(Ehdr) *)file;
|
ehdr = (ElfW(Ehdr) *)file;
|
||||||
if (memcmp(ehdr->e_ident, "\177ELF", 4) != 0) {
|
if (memcmp(ehdr->e_ident, "\177ELF", 4) != 0) {
|
||||||
@ -532,11 +532,8 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
|
|||||||
* Huh? Maybe filename was overridden by setproctitle() and
|
* Huh? Maybe filename was overridden by setproctitle() and
|
||||||
* it match non-elf file.
|
* it match non-elf file.
|
||||||
*/
|
*/
|
||||||
close(fd);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
obj->fd = fd;
|
|
||||||
obj->mapped = file;
|
obj->mapped = file;
|
||||||
obj->mapped_size = (size_t)filesize;
|
obj->mapped_size = (size_t)filesize;
|
||||||
|
|
||||||
@ -790,9 +787,8 @@ next_line:
|
|||||||
while (obj) {
|
while (obj) {
|
||||||
obj_info_t *o = obj;
|
obj_info_t *o = obj;
|
||||||
obj = o->next;
|
obj = o->next;
|
||||||
if (o->fd) {
|
if (o->mapped_size) {
|
||||||
munmap(o->mapped, o->mapped_size);
|
munmap(o->mapped, o->mapped_size);
|
||||||
close(o->fd);
|
|
||||||
}
|
}
|
||||||
free(o);
|
free(o);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user