summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-04-25 17:35:45 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2008-04-25 17:35:45 +0100
commit7c8f37f3755ffa04daf3860e878f279a5ecfba90 (patch)
tree3a9d8b6e2daac76bf37ba3d575201b98d8d7000f
parentb59ee5b767b2488de73c5265a990dd7bced874de (diff)
Avoid allocation for constant string.
-rw-r--r--src/minibfd/binfile.c47
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