Skip sections which are not PROGBITS
[elfdbg/.git] / elfdbg.c
index a3676fad63af9f7921ed7581aecc3674b0f249d7..4cca84e48d04e76e200929ab263ef095408dc75f 100644 (file)
--- a/elfdbg.c
+++ b/elfdbg.c
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <err.h>
-#include <fcntl.h>
-#include <gelf.h>
-#include <stdint.h>
-#include <string.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sysexits.h>
 #include <unistd.h>
 
-static int
-elf_debug_sections(Elf *e)
-{
-       Elf_Scn *scn = NULL;
-       GElf_Shdr shdr;
-       size_t n, shstrndx, sz;
-       char *name;
-       int has_debug = 0;
-
-       if (elf_getshdrstrndx(e, &shstrndx) != 0)
-               errx(EX_SOFTWARE, "elf_getshdrstrndx() failed : %s . ",
-                   elf_errmsg(-1));
+#include "elf.h"
 
-       while ((scn = elf_nextscn(e, scn)) != NULL) {
-               gelf_getshdr(scn, &shdr);
+extern char *__progname;
 
-               name = elf_strptr(e, shstrndx, shdr.sh_name);
-               if (!strstr(name, "debug_"))
-                       continue;
-
-               has_debug++;
-       }
-
-       return (has_debug > 0);
+static void
+usage(void)
+{
+       fprintf(stderr, "Usage: %s [-qv] file\n", __progname);
+       exit(EX_USAGE);
 }
 
 int
 main(int argc, char *argv[])
 {
-       int fd, rc;
-       Elf *e;
-       int has_debug;
+       int rc, has_debug;
+       int ch, qflag=0, vflag=0;
+       Elf_Obj *e = NULL;
+       Elf_Shdr *shstr = NULL;
 
-       if (elf_version(EV_CURRENT) == EV_NONE)
-               errx(EX_SOFTWARE, "ELF library initialization failed : %s ",
-                   elf_errmsg(-1));
+       if (argc == 1)
+               usage();
 
-       if ((fd = open(argv[1], O_RDONLY, 0)) < 0)
-               err(EX_NOINPUT, "open %s failed ", argv[1]);
-       if ((e = elf_begin(fd, ELF_C_READ, NULL)) == NULL)
-               errx(EX_SOFTWARE, "elf_begin() failed : %s", elf_errmsg(-1));
-       if (elf_kind(e) != ELF_K_ELF)
-               errx(EX_DATAERR, "%s is not an ELF object", argv[1]);
+       while ((ch = getopt(argc, argv, "qhv")) != -1) {
+               switch (ch) {
+                       case 'q':
+                               qflag = 1;
+                               break;
+                       case 'v':
+                               vflag = 1;
+                               break;
+                       case 'h':
+                               default:
+                               usage();
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+
+       /* load elf binary in memory */
+       e = elf_init(*argv);
+       if (e == NULL)
+               errx(EX_DATAERR, "elf_init");
+
+       /* load string stable */
+       shstr = elf_strtab(e);
 
-       has_debug = elf_debug_sections(e);
-       printf(has_debug ? "HAS DEBUG\n" : "NO DEBUG\n");
+       /* search for sections name with debug prefix */
+       has_debug = elf_debug(e);
 
-       rc = close(fd);
-       rc = elf_end(e);
+       if (!qflag)
+               printf("%s\n", (has_debug > 0) ? "HAS DEBUG" : "NO DEBUG");
+
+       if (vflag)
+               elf_debug_print(e);
+
+       rc = elf_destroy(e);
+
+       if (qflag) {
+               rc = has_debug > 0;
+       }
 
        return (rc);
 }