Blob Blame History Raw
--- binutils.orig/binutils/dwarf.c	2020-10-15 12:13:21.960799738 +0100
+++ binutils-2.35.1/binutils/dwarf.c	2020-10-15 13:02:39.454692627 +0100
@@ -10427,7 +10427,7 @@ load_separate_debug_info (const char *
     {
       warn (_("Corrupt debuglink section: %s\n"),
 	    xlink->name ? xlink->name : xlink->uncompressed_name);
-      return FALSE;
+      return NULL;
     }
     
   /* Attempt to locate the separate file.
@@ -10587,7 +10587,7 @@ load_separate_debug_info (const char *
     {
       warn (_("failed to open separate debug file: %s\n"), debug_filename);
       free (debug_filename);
-      return FALSE;
+      return NULL;
     }
 
   /* FIXME: We do not check to see if there are any other separate debug info
@@ -10632,6 +10632,52 @@ load_dwo_file (const char * main_filenam
   return separate_handle;
 }
 
+/* Load a debuglink section and/or a debugaltlink section, if either are present.
+   Recursively check the loaded files for more of these sections.
+   FIXME: Should also check for DWO_* entries in the newlu loaded files.  */
+
+static void
+check_for_and_load_links (void * file, const char * filename)
+{
+  void * handle = NULL;
+
+  if (load_debug_section (gnu_debugaltlink, file))
+    {
+      Build_id_data build_id_data;
+
+      handle = load_separate_debug_info (filename,
+					 & debug_displays[gnu_debugaltlink].section,
+					 parse_gnu_debugaltlink,
+					 check_gnu_debugaltlink,
+					 & build_id_data,
+					 file);
+      if (handle)
+	{
+	  assert (handle == first_separate_info->handle);
+	  check_for_and_load_links (first_separate_info->handle,
+				    first_separate_info->filename);
+	}
+    }
+
+  if (load_debug_section (gnu_debuglink, file))
+    {
+      unsigned long crc32;
+
+      handle = load_separate_debug_info (filename,
+					 & debug_displays[gnu_debuglink].section,
+					 parse_gnu_debuglink,
+					 check_gnu_debuglink,
+					 & crc32,
+					 file);
+      if (handle)
+	{
+	  assert (handle == first_separate_info->handle);
+	  check_for_and_load_links (first_separate_info->handle,
+				    first_separate_info->filename);
+	}
+    }
+}
+
 /* Load the separate debug info file(s) attached to FILE, if any exist.
    Returns TRUE if any were found, FALSE otherwise.
    If TRUE is returned then the linked list starting at first_separate_info
@@ -10707,34 +10753,10 @@ load_separate_debug_files (void * file,
     return FALSE;
 
   /* FIXME: We do not check for the presence of both link sections in the same file.  */
-  /* FIXME: We do not check the separate debug info file to see if it too contains debuglinks.  */
   /* FIXME: We do not check for the presence of multiple, same-name debuglink sections.  */
   /* FIXME: We do not check for the presence of a dwo link as well as a debuglink.  */
 
-  if (load_debug_section (gnu_debugaltlink, file))
-    {
-      Build_id_data * build_id_data;
-
-      load_separate_debug_info (filename,
-				& debug_displays[gnu_debugaltlink].section,
-				parse_gnu_debugaltlink,
-				check_gnu_debugaltlink,
-				& build_id_data,
-				file);
-    }
-
-  if (load_debug_section (gnu_debuglink, file))
-    {
-      unsigned long crc32;
-
-      load_separate_debug_info (filename,
-				& debug_displays[gnu_debuglink].section,
-				parse_gnu_debuglink,
-				check_gnu_debuglink,
-				& crc32,
-				file);
-    }
-
+  check_for_and_load_links (file, filename);
   if (first_separate_info != NULL)
     return TRUE;