From 91910cddf13d04ea3831c9af2f9c6ff27a9c0f33 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 23 Aug 2008 08:08:58 +0000 Subject: [PATCH] (find_separate_debug_file): Use the canonical absolute name of the bfd object for finding the debug file in the global debugfile directory. --- bfd/ChangeLog | 6 ++++++ bfd/opncls.c | 30 ++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index dc629361b2..5319857f32 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2008-08-23 Andreas Schwab + + * opncls.c (find_separate_debug_file): Use the canonical + absolute name of the bfd object for finding the debug file in + the global debugfile directory. + 2008-08-22 Jakub Jelinek Fix PR ld/3290 regression for cross-files DW_FORM_ref_addr relocations. diff --git a/bfd/opncls.c b/bfd/opncls.c index 2ceb77eb21..7be82b2194 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1,6 +1,6 @@ /* opncls.c -- open and close a BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Cygnus Support. @@ -1224,9 +1224,10 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) char *basename; char *dir; char *debugfile; + char *canon_dir; unsigned long crc32; - int i; size_t dirlen; + size_t canon_dirlen; BFD_ASSERT (abfd); if (debug_file_directory == NULL) @@ -1263,8 +1264,16 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) memcpy (dir, abfd->filename, dirlen); dir[dirlen] = '\0'; + /* Compute the canonical name of the bfd object with all symbolic links + resolved, for use in the global debugfile directory. */ + canon_dir = lrealpath (abfd->filename); + for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--) + if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1])) + break; + canon_dir[canon_dirlen] = '\0'; + debugfile = bfd_malloc (strlen (debug_file_directory) + 1 - + dirlen + + (canon_dirlen > dirlen ? canon_dirlen : dirlen) + strlen (".debug/") + strlen (basename) + 1); @@ -1272,6 +1281,7 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) { free (basename); free (dir); + free (canon_dir); return NULL; } @@ -1283,6 +1293,7 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) { free (basename); free (dir); + free (canon_dir); return debugfile; } @@ -1295,29 +1306,32 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) { free (basename); free (dir); + free (canon_dir); return debugfile; } /* Then try in the global debugfile directory. */ strcpy (debugfile, debug_file_directory); - i = strlen (debug_file_directory) - 1; - if (i > 0 - && debug_file_directory[i] != '/' - && dir[0] != '/') + dirlen = strlen (debug_file_directory) - 1; + if (dirlen > 0 + && debug_file_directory[dirlen] != '/' + && canon_dir[0] != '/') strcat (debugfile, "/"); - strcat (debugfile, dir); + strcat (debugfile, canon_dir); strcat (debugfile, basename); if (separate_debug_file_exists (debugfile, crc32)) { free (basename); free (dir); + free (canon_dir); return debugfile; } free (debugfile); free (basename); free (dir); + free (canon_dir); return NULL; }