Initial commit
[elfdbg/.git] / elfdbg.c
CommitLineData
f4b470b9
SB
1/*-
2 * Copyright (c) 2015 Sofian Brabez <sbz@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer
10 * in this position and unchanged.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26#include <err.h>
27#include <fcntl.h>
28#include <gelf.h>
29#include <stdint.h>
30#include <string.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <sysexits.h>
34#include <unistd.h>
35
36static int
37elf_debug_sections(Elf *e) {
38 Elf_Scn *scn=NULL;
39 GElf_Shdr shdr;
40 size_t n, shstrndx, sz;
41 char *name;
42 int has_debug=0;
43
44 if (elf_getshdrstrndx(e, &shstrndx) != 0)
45 errx(EX_SOFTWARE, "elf_getshdrstrndx() failed : %s . " , elf_errmsg(-1));
46
47 while ((scn = elf_nextscn(e, scn)) != NULL) {
48 gelf_getshdr(scn, &shdr);
49
50 name = elf_strptr(e, shstrndx, shdr.sh_name);
51 if (!strstr(name, "debug_"))
52 continue;
53
54 has_debug++;
55
56 }
57
58 return (has_debug > 0);
59}
60
61int main(int argc, char *argv[]) {
62 int fd, rc;
63 Elf *e;
64 int has_debug;
65
66 if (elf_version(EV_CURRENT) == EV_NONE )
67 errx(EX_SOFTWARE, "ELF library initialization failed : %s ", elf_errmsg(-1));
68
69 if ((fd =open(argv [1], O_RDONLY , 0)) < 0)
70 err(EX_NOINPUT,"open %s failed ", argv [1]);
71 if ((e = elf_begin(fd, ELF_C_READ , NULL)) == NULL)
72 errx(EX_SOFTWARE, "elf_begin () failed : %s . ", elf_errmsg(-1));
73 if (elf_kind(e) != ELF_K_ELF)
74 errx(EX_DATAERR, "%s is not an ELF object . ", argv[1]);
75
76 has_debug=elf_debug_sections(e);
77 printf(has_debug ? "HAS DEBUG\n" : "NO DEBUG\n");
78
79 rc=close(fd);
80 rc=elf_end(e);
81
82 return (rc);
83}