Add support for Linux
authorSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 15:36:11 +0000 (17:36 +0200)
committerSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 16:07:33 +0000 (18:07 +0200)
GNUMakefile [new file with mode: 0644]
Makefile
README.md
compat.c [new file with mode: 0644]
compat.h [new file with mode: 0644]
elf.h

diff --git a/GNUMakefile b/GNUMakefile
new file mode 100644 (file)
index 0000000..ee32005
--- /dev/null
@@ -0,0 +1,24 @@
+CC?=   cc
+CFLAGS?=       -O2 -g -pipe -D_DEFAULT_SOURCE -Wincompatible-pointer-types
+SRCS=  elf.c elfdbg.c compat.c
+OBJS=  ${SRCS:.c=.o}
+PREFIX?=       /usr/local
+
+all: elfdbg
+
+elfdbg: ${OBJS}
+       ${CC} ${OBJS} ${LDFLAGS} -o $@
+
+.c.o:
+       ${CC} ${CFLAGS} -c $<
+
+install: elfdbg
+       install -m 755 elfdbg ${DESTDIR}${PREFIX}/bin/
+
+install-strip: elfdbg
+       install -s -m 755 elfdbg ${DESTDIR}${PREFIX}/bin/
+
+clean:
+       rm -rf ${OBJS} elfdbg
+
+.PHONY: elfdbg
index 8d46f2f4f4e456fdec7c4db82c4ffc101f47ee1e..afa034ba60866d1ae897969911714e3acc41745f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ BINDIR= ${PREFIX}/bin
 
 PROG=  elfdbg
 MAN=   elfdbg.1
-SRCS=  elfdbg.c elf.c
+SRCS=  elfdbg.c elf.c compat.c
 
 test:
        @(cd tests && kyua test && kyua report)
index b08c85913f2e85e20768b0e45262232e018f9466..a9b680741b7d9d5fcf234255a9fc30c87117285d 100644 (file)
--- a/README.md
+++ b/README.md
@@ -42,12 +42,14 @@ pkg info -a -l|grep local/bin/|while read a; do echo $a: `elfdbg $a`; done
 
 ## Build and install
 
-The Makefile use the standard BSDMakefile to build the program.
+The Makefile use the standard BSD Makefile to build the program.
 
 ```
 make && sudo make install
 ```
 
+If your on Linux, use `make -f GNUMakefile` to specify the GNU Makefile.
+
 ## Test
 
 The tests cases are implemented using the FreeBSD test suite framework with
diff --git a/compat.c b/compat.c
new file mode 100644 (file)
index 0000000..b23af01
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,22 @@
+#include <string.h>
+
+char *
+strnstr(const char *s, const char *find, size_t slen)
+{
+    char c, sc;
+    size_t len;
+
+    if ((c = *find++) != '\0') {
+        len = strlen(find);
+        do {
+            do {
+                if (slen-- < 1 || (sc = *s++) == '\0')
+                    return (NULL);
+            } while (sc != c);
+            if (len > slen)
+                return (NULL);
+        } while (strncmp(s, find, len) != 0);
+        s--;
+    }
+    return ((char *)s);
+}
diff --git a/compat.h b/compat.h
new file mode 100644 (file)
index 0000000..94456a7
--- /dev/null
+++ b/compat.h
@@ -0,0 +1,18 @@
+#ifndef ELFDBG_COMPAT_H
+#define ELFDBG_COMPAT_H 1
+
+/* Linux does not define the generic typedef arch independant */
+#ifdef __linux__
+#ifdef __x86_64__
+typedef Elf64_Ehdr Elf_Ehdr;
+typedef Elf64_Shdr Elf_Shdr;
+#else
+typedef Elf32_Ehdr Elf_Ehdr;
+typedef Elf32_Shdr Elf_Shdr;
+#endif
+
+/* Linux does not define strnstr() function */
+char *strnstr(const char *, const char *, size_t);
+#endif
+
+#endif /* ELFDBG_COMPAT_H */
diff --git a/elf.h b/elf.h
index 3697d0f240eedf0ddaba56c9eec0ed0a97a9eaaa..67a5c8436231e723caddad794994c11b4fc4cd1d 100644 (file)
--- a/elf.h
+++ b/elf.h
@@ -1,6 +1,11 @@
+#ifndef ELFDBG_ELF_H
+#define ELFDBG_ELF_H 1
+
 #include <elf.h>
 #include <sys/stat.h>
 
+#include "compat.h"
+
 typedef struct Elf_Obj {
     int         fd; /* file descriptor */
     struct stat sb; /* file stat */
@@ -19,3 +24,5 @@ Elf_Shdr *elf_strtab(Elf_Obj *);
 char *elf_str_get(Elf_Obj *, int);
 int elf_debug(Elf_Obj *);
 void elf_debug_print(Elf_Obj *);
+
+#endif /* ELFDBG_ELF_H */