Add arguments flag -q for quiet mode and -v for verbose mode
authorSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 13:59:01 +0000 (15:59 +0200)
committerSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 14:57:56 +0000 (16:57 +0200)
Quiet mode is not printing any output and verbose mode is listing the
name of the debug sections in standard output.

Quiet mode is designed to be used in shell script like above:

if elfdbg -q /bin/date; then
    echo "No symbols"
else
    echo "Binary with debug symbols"
fi

elf.c
elf.h
elfdbg.c

diff --git a/elf.c b/elf.c
index 5ae212e851fd3c89fccbff73abbe417727244143..e73e9c49d03c020b54ccbbaa645463177b81bcf0 100644 (file)
--- a/elf.c
+++ b/elf.c
@@ -113,4 +113,20 @@ elf_debug(Elf_Obj *e)
 
     return (has_debug);
 }
+
+void
+elf_debug_print(Elf_Obj *e)
+{
+    int i;
+    char *debug_prefix = ".debug_";
+    char *section_name = NULL;
+
+    printf("%d ELF debug sections:\n", elf_debug(e));
+
+    for (i=0; i < e->shdr_size; i++) {
+        section_name = elf_str_get(e, i);
+        if (strnstr(section_name, debug_prefix, strlen(debug_prefix))) {
+            printf("%s\n", section_name);
+        }
+    }
 }
diff --git a/elf.h b/elf.h
index 7446f1232cc6d18dd3ebcac0e759ef084ed848e5..3697d0f240eedf0ddaba56c9eec0ed0a97a9eaaa 100644 (file)
--- a/elf.h
+++ b/elf.h
@@ -18,3 +18,4 @@ int elf_destroy(Elf_Obj *);
 Elf_Shdr *elf_strtab(Elf_Obj *);
 char *elf_str_get(Elf_Obj *, int);
 int elf_debug(Elf_Obj *);
+void elf_debug_print(Elf_Obj *);
index d54b0d3b3e90d48c8624c4c79561c2b77011ab86..4cca84e48d04e76e200929ab263ef095408dc75f 100644 (file)
--- a/elfdbg.c
+++ b/elfdbg.c
@@ -24,6 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <err.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -37,7 +38,7 @@ extern char *__progname;
 static void
 usage(void)
 {
-       fprintf(stderr, "Usage: %s file\n", __progname);
+       fprintf(stderr, "Usage: %s [-qv] file\n", __progname);
        exit(EX_USAGE);
 }
 
@@ -45,16 +46,34 @@ int
 main(int argc, char *argv[])
 {
        int rc, has_debug;
+       int ch, qflag=0, vflag=0;
        Elf_Obj *e = NULL;
        Elf_Shdr *shstr = NULL;
 
        if (argc == 1)
                usage();
 
+       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[1]);
-    if (e == NULL)
-        errx(EX_DATAERR, "elf_init");
+       e = elf_init(*argv);
+       if (e == NULL)
+               errx(EX_DATAERR, "elf_init");
 
        /* load string stable */
        shstr = elf_strtab(e);
@@ -62,9 +81,17 @@ main(int argc, char *argv[])
        /* search for sections name with debug prefix */
        has_debug = elf_debug(e);
 
-       printf("%s\n", (has_debug > 0) ? "HAS DEBUG" : "NO DEBUG");
+       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);
 }