]>
Commit | Line | Data |
---|---|---|
f4b470b9 SB |
1 | /*- |
2 | * Copyright (c) 2015 Sofian Brabez <sbz@FreeBSD.org> | |
3 | * All rights reserved. | |
3131de8b | 4 | * |
f4b470b9 SB |
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. | |
3131de8b | 14 | * |
f4b470b9 SB |
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 | ||
36 | static int | |
3131de8b SB |
37 | elf_debug_sections(Elf *e) |
38 | { | |
39 | Elf_Scn *scn = NULL; | |
40 | GElf_Shdr shdr; | |
41 | size_t n, shstrndx, sz; | |
42 | char *name; | |
43 | int has_debug = 0; | |
f4b470b9 | 44 | |
3131de8b SB |
45 | if (elf_getshdrstrndx(e, &shstrndx) != 0) |
46 | errx(EX_SOFTWARE, "elf_getshdrstrndx() failed : %s . ", | |
47 | elf_errmsg(-1)); | |
f4b470b9 | 48 | |
3131de8b SB |
49 | while ((scn = elf_nextscn(e, scn)) != NULL) { |
50 | gelf_getshdr(scn, &shdr); | |
f4b470b9 | 51 | |
3131de8b SB |
52 | name = elf_strptr(e, shstrndx, shdr.sh_name); |
53 | if (!strstr(name, "debug_")) | |
54 | continue; | |
f4b470b9 | 55 | |
3131de8b SB |
56 | has_debug++; |
57 | } | |
f4b470b9 | 58 | |
3131de8b | 59 | return (has_debug > 0); |
f4b470b9 SB |
60 | } |
61 | ||
3131de8b SB |
62 | int |
63 | main(int argc, char *argv[]) | |
64 | { | |
65 | int fd, rc; | |
66 | Elf *e; | |
67 | int has_debug; | |
f4b470b9 | 68 | |
3131de8b SB |
69 | if (elf_version(EV_CURRENT) == EV_NONE) |
70 | errx(EX_SOFTWARE, "ELF library initialization failed : %s ", | |
71 | elf_errmsg(-1)); | |
f4b470b9 | 72 | |
3131de8b SB |
73 | if ((fd = open(argv[1], O_RDONLY, 0)) < 0) |
74 | err(EX_NOINPUT, "open %s failed ", argv[1]); | |
75 | if ((e = elf_begin(fd, ELF_C_READ, NULL)) == NULL) | |
76 | errx(EX_SOFTWARE, "elf_begin() failed : %s", elf_errmsg(-1)); | |
77 | if (elf_kind(e) != ELF_K_ELF) | |
78 | errx(EX_DATAERR, "%s is not an ELF object", argv[1]); | |
f4b470b9 | 79 | |
3131de8b SB |
80 | has_debug = elf_debug_sections(e); |
81 | printf(has_debug ? "HAS DEBUG\n" : "NO DEBUG\n"); | |
f4b470b9 | 82 | |
3131de8b SB |
83 | rc = close(fd); |
84 | rc = elf_end(e); | |
f4b470b9 SB |
85 | |
86 | return (rc); | |
87 | } |