--- binutils.orig/binutils/readelf.c 2021-07-19 12:39:14.206556025 +0100 +++ binutils-2.37/binutils/readelf.c 2021-07-19 12:44:37.712728732 +0100 @@ -21873,45 +21873,52 @@ process_file (char * file_name) struct stat statbuf; char armag[SARMAG]; bool ret = true; + char * name; + char * saved_program_name; + + /* Overload program_name to include file_name. Doing this means + that warning/error messages will positively identify the file + concerned even when multiple instances of readelf are running. */ + name = xmalloc (strlen (program_name) + strlen (file_name) + 3); + sprintf (name, "%s: %s", program_name, file_name); + saved_program_name = program_name; + program_name = name; if (stat (file_name, &statbuf) < 0) { if (errno == ENOENT) - error (_("'%s': No such file\n"), file_name); + error (_("No such file\n")); else - error (_("Could not locate '%s'. System error message: %s\n"), - file_name, strerror (errno)); - return false; + error (_("Could not locate file. System error message: %s\n"), + strerror (errno)); + goto done; } if (! S_ISREG (statbuf.st_mode)) { - error (_("'%s' is not an ordinary file\n"), file_name); - return false; + error (_("Not an ordinary file\n")); + goto done; } filedata = calloc (1, sizeof * filedata); if (filedata == NULL) { error (_("Out of memory allocating file data structure\n")); - return false; + goto done; } filedata->file_name = file_name; filedata->handle = fopen (file_name, "rb"); if (filedata->handle == NULL) { - error (_("Input file '%s' is not readable.\n"), file_name); - free (filedata); - return false; + error (_("Not readable\n")); + goto done; } if (fread (armag, SARMAG, 1, filedata->handle) != 1) { - error (_("%s: Failed to read file's magic number\n"), file_name); - fclose (filedata->handle); - free (filedata); - return false; + error (_("Failed to read file's magic number\n")); + goto done; } filedata->file_size = (bfd_size_type) statbuf.st_size; @@ -21919,33 +21926,39 @@ process_file (char * file_name) if (memcmp (armag, ARMAG, SARMAG) == 0) { - if (! process_archive (filedata, false)) - ret = false; + if (process_archive (filedata, false)) + ret = true; } else if (memcmp (armag, ARMAGT, SARMAG) == 0) { - if ( ! process_archive (filedata, true)) - ret = false; + if (process_archive (filedata, true)) + ret = true; } else { if (do_archive_index && !check_all) - error (_("File %s is not an archive so its index cannot be displayed.\n"), - file_name); + error (_("Not an archive so its index cannot be displayed.\n")); rewind (filedata->handle); filedata->archive_file_size = filedata->archive_file_offset = 0; - if (! process_object (filedata)) - ret = false; + if (process_object (filedata)) + ret = true; } - fclose (filedata->handle); - free (filedata->section_headers); - free (filedata->program_headers); - free (filedata->string_table); - free (filedata->dump.dump_sects); - free (filedata); + done: + if (filedata) + { + if (filedata->handle != NULL) + fclose (filedata->handle); + free (filedata->section_headers); + free (filedata->program_headers); + free (filedata->string_table); + free (filedata->dump.dump_sects); + free (filedata); + } + free (program_name); + program_name = saved_program_name; free (ba_cache.strtab); ba_cache.strtab = NULL;