Skip sections which are not PROGBITS
[elfdbg/.git] / elfdbg.c
index 7db5ea6f606729bb547b62defde694b97dbb88f6..4cca84e48d04e76e200929ab263ef095408dc75f 100644 (file)
--- a/elfdbg.c
+++ b/elfdbg.c
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2015 Sofian Brabez <sbz@FreeBSD.org>
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -11,7 +11,7 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  * 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;
+#include "elf.h"
+
+extern char *__progname;
 
-        if (elf_getshdrstrndx(e, &shstrndx) != 0)
-                errx(EX_SOFTWARE, "elf_getshdrstrndx() failed : %s . " , elf_errmsg(-1));
+static void
+usage(void)
+{
+       fprintf(stderr, "Usage: %s [-qv] file\n", __progname);
+       exit(EX_USAGE);
+}
 
-        while ((scn = elf_nextscn(e, scn)) != NULL) {
-                gelf_getshdr(scn, &shdr);
+int
+main(int argc, char *argv[])
+{
+       int rc, has_debug;
+       int ch, qflag=0, vflag=0;
+       Elf_Obj *e = NULL;
+       Elf_Shdr *shstr = NULL;
 
-                name = elf_strptr(e, shstrndx, shdr.sh_name);
-                if (!strstr(name, "debug_"))
-                    continue;
+       if (argc == 1)
+               usage();
 
-                has_debug++;
+       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;
 
-        return (has_debug > 0);
-}
+       /* load elf binary in memory */
+       e = elf_init(*argv);
+       if (e == NULL)
+               errx(EX_DATAERR, "elf_init");
+
+       /* load string stable */
+       shstr = elf_strtab(e);
 
-int main(int argc, char *argv[]) {
-        int fd, rc;
-        Elf *e;
-        int has_debug;
+       /* search for sections name with debug prefix */
+       has_debug = elf_debug(e);
 
-        if (elf_version(EV_CURRENT) == EV_NONE )
-                errx(EX_SOFTWARE, "ELF library initialization failed : %s ", elf_errmsg(-1));
+       if (!qflag)
+               printf("%s\n", (has_debug > 0) ? "HAS DEBUG" : "NO DEBUG");
 
-        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]);
+       if (vflag)
+               elf_debug_print(e);
 
-        has_debug=elf_debug_sections(e);
-        printf(has_debug ? "HAS DEBUG\n" : "NO DEBUG\n");
+       rc = elf_destroy(e);
 
-       rc=close(fd);
-       rc=elf_end(e);
+       if (qflag) {
+               rc = has_debug > 0;
+       }
 
        return (rc);
 }