https://sourceware.org/bugzilla/show_bug.cgi?id=21203
Bug ID: 21203 Summary: Poor error handling for archives with non-ELF members Product: elfutils Version: unspecified Status: NEW Severity: normal Priority: P2 Component: general Assignee: unassigned at sourceware dot org Reporter: jistone at redhat dot com CC: elfutils-devel at sourceware dot org Target Milestone: --- Elfutils doesn't seem to behave well when it encounters non-ELF objects in an archive. As an easy example, a Rust *.rlib contains both ELF *.o and non-ELF metadata and bytecode. $ eu-readelf -h /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-*.rlib eu-readelf: cannot stat input file: Bad file descriptor For comparison, binutils prints errors about the unrecognized objects, but still provides useful output for the rest. $ readelf -h /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-*.rlib [...] File: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-570da8f8.rlib(rust.metadata.bin) readelf: Error: Not an ELF file - it has the wrong magic bytes at the start File: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-570da8f8.rlib(std-570da8f8.0.bytecode.deflate) readelf: Error: Not an ELF file - it has the wrong magic bytes at the start This particular archive has 13 ELF and those 2 non-ELF members. With strace, I can see 13 close(4) calls in a row, followed by the fstat(4,...) that leads to "cannot stat input file". Then there's yet another close(4)=EBADF, *after* that file descriptor was already momentarily re-used for locale purposes. open("/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-570da8f8.rlib", O_RDONLY) = 3 dup(3) = 4 fcntl(4, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE) fstat(4, {st_mode=S_IFREG|0644, st_size=12447250, ...}) = 0 mmap(NULL, 12447250, PROT_READ|PROT_WRITE, MAP_PRIVATE, 4, 0) = 0x7fc8577ba000 mmap(NULL, 692224, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc85fcae000 close(4) = 0 close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) fstat(4, 0x7ffd45ce0630) = -1 EBADF (Bad file descriptor) open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4 fstat(4, {st_mode=S_IFREG|0644, st_size=2502, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc85fd6c000 read(4, "# Locale name alias data base.\n#"..., 4096) = 2502 read(4, "", 4096) = 0 close(4) = 0 munmap(0x7fc85fd6c000, 4096) = 0 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/elfutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) write(2, "eu-readelf: ", 12eu-readelf: ) = 12 write(2, "cannot stat input file", 22cannot stat input file) = 22 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) write(2, ": Bad file descriptor", 21: Bad file descriptor) = 21 write(2, "\n", 1 ) = 1 close(4) = -1 EBADF (Bad file descriptor) munmap(0x7fc85fcae000, 692224) = 0 close(3) = 0 exit_group(1) = ? +++ exited with 1 +++ -- You are receiving this mail because: You are on the CC list for the bug.