diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-04-25 17:35:45 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-04-25 17:35:45 +0100 |
commit | 7c8f37f3755ffa04daf3860e878f279a5ecfba90 (patch) | |
tree | 3a9d8b6e2daac76bf37ba3d575201b98d8d7000f | |
parent | b59ee5b767b2488de73c5265a990dd7bced874de (diff) |
Avoid allocation for constant string.
-rw-r--r-- | src/minibfd/binfile.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/minibfd/binfile.c b/src/minibfd/binfile.c index 38cc569..dd6aef1 100644 --- a/src/minibfd/binfile.c +++ b/src/minibfd/binfile.c @@ -49,12 +49,14 @@ #define DEBUGDIR "/usr/lib/debug" +static const char * const vdso = "[vdso]"; + static ino_t read_inode (const char *filename) { struct stat statbuf; - if (strcmp (filename, "[vdso]") == 0) + if (strcmp (filename, vdso) == 0) return (ino_t)0; if (stat (filename, &statbuf) < 0) @@ -84,8 +86,6 @@ separate_debug_file_exists (const char *name, guint32 crc, gboolean force) return parser; } -static const char *const debug_file_directory = DEBUGDIR; - static ElfParser * get_debug_file (ElfParser *elf, const char *filename, char **new_name) { @@ -108,8 +108,8 @@ get_debug_file (ElfParser *elf, const char *filename, char **new_name) tries[0] = g_build_filename (dir, basename, NULL); tries[1] = g_build_filename (dir, ".debug", basename, NULL); - tries[2] = g_build_filename ("/usr", "lib", "debug", dir, basename, NULL); - tries[3] = g_build_filename (debug_file_directory, dir, basename, NULL); + tries[2] = g_build_filename ("/usr" G_DIR_SEPARATOR_S "lib" G_DIR_SEPARATOR_S "debug", dir, basename, NULL); + tries[3] = g_build_filename (DEBUGDIR, dir, basename, NULL); for (i = 0; i < N_TRIES; ++i) { result = separate_debug_file_exists (tries[i], crc32, FALSE); @@ -140,7 +140,7 @@ get_debug_file (ElfParser *elf, const char *filename, char **new_name) static ElfParser * find_separate_debug_file (ElfParser *elf, const char *filename, char **real_filename) { - ElfParser *debug; + ElfParser *debug, *ret = NULL; char *debug_name = NULL; char *fname; GHashTable *seen_names = g_hash_table_new_full (g_str_hash, @@ -158,7 +158,7 @@ find_separate_debug_file (ElfParser *elf, const char *filename, char **real_file debug = get_debug_file (elf, fname, &debug_name); if (debug != NULL) { elf_parser_free (elf); - elf = debug; + elf = ret = debug; g_hash_table_insert (seen_names, fname, fname); fname = debug_name; @@ -168,18 +168,18 @@ find_separate_debug_file (ElfParser *elf, const char *filename, char **real_file *real_filename = fname; g_hash_table_destroy (seen_names); - return elf; + return ret; } void bin_file_init (BinFile *bf, const char *filename) { bf->elf = NULL; - bf->filename = g_strdup (filename); bf->real_filename = NULL; bf->inode_check = FALSE; - if (strcmp (filename, "[vdso]") == 0) { + if (strcmp (filename, vdso) == 0) { + bf->filename = (char *) vdso; #if 0 gsize length; const guint8 *vdso_bytes = NULL; @@ -190,8 +190,10 @@ bin_file_init (BinFile *bf, const char *filename) else bf->elf = NULL; #endif - } else + } else { + bf->filename = g_strdup (filename); bf->elf = elf_parser_new (filename, NULL); + } /* We need the text offset of the actual binary, not the * (potential) debug binary @@ -211,7 +213,7 @@ bin_file_open (BinFile *bf) if (bf->elf != NULL) return; - if (strcmp (bf->filename, "[vdso]") == 0) { + if (bf->filename == vdso) { /* permanent */ } else if (bf->real_filename != NULL) { bf->elf = elf_parser_new (bf->real_filename, NULL); @@ -225,7 +227,7 @@ bin_file_close (BinFile *bf) if (bf->elf == NULL) return; - if (strcmp (bf->filename, "[vdso]")) { + if (bf->filename == vdso) { elf_parser_free (bf->elf); bf->elf = NULL; } @@ -238,7 +240,8 @@ bin_file_fini (BinFile *bf) elf_parser_free (bf->elf); g_free (bf->real_filename); - g_free (bf->filename); + if (bf->filename != vdso) + g_free (bf->filename); } gboolean @@ -249,17 +252,13 @@ bin_file_lookup_symbol (BinFile *bf, const char **path, guint *line) { - if (bf->elf != NULL) { - address -= bf->text_offset; + g_assert (bf->elf != NULL); - return elf_parser_lookup_symbol (bf->elf, address, - function, - filename, - path, - line); - } - - return FALSE; + return elf_parser_lookup_symbol (bf->elf, address - bf->text_offset, + function, + filename, + path, + line); } gboolean |