Also move 32/64-bit X-macros (e.g PERBIT) from toplevel
elfops.c into elf_core.c as these are private.

Signed-off-by: Andreas Robinson <[email protected]>
---
 Makefile.am |    4 ++--
 depmod.c    |    1 +
 elf_core.c  |   19 +++++++++++++++++++
 elfops.c    |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 elfops.h    |   13 +++++++++++++
 modinfo.c   |    1 +
 modprobe.c  |    1 +
 moduleops.c |    1 +
 util.c      |   46 +---------------------------------------------
 util.h      |    8 --------
 10 files changed, 91 insertions(+), 55 deletions(-)
 create mode 100644 elfops.c
 create mode 100644 elfops.h

diff --git a/Makefile.am b/Makefile.am
index e5bb4c7..82ccf28 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -22,8 +22,8 @@ EXTRA_insmod_static_SOURCES =
 EXTRA_depmod_SOURCES = moduleops_core.c
 EXTRA_modinfo_SOURCES =
 
-libmodtools_a_SOURCES = util.c logging.c index.c config_filter.c \
-       util.h depmod.h logging.h index.h list.h config_filter.h
+libmodtools_a_SOURCES = util.c logging.c index.c config_filter.c elfops.c
+       util.h depmod.h logging.h index.h list.h config_filter.h elfops.h
 libmodtools_a_CFLAGS = -ffunction-sections
 
 EXTRA_libmodtools_a_SOURCES = elf_core.c
diff --git a/depmod.c b/depmod.c
index 3544b89..721f471 100644
--- a/depmod.c
+++ b/depmod.c
@@ -26,6 +26,7 @@
 #include "depmod.h"
 #include "logging.h"
 #include "index.h"
+#include "elfops.h"
 #include "moduleops.h"
 #include "tables.h"
 #include "config_filter.h"
diff --git a/elf_core.c b/elf_core.c
index 1525c36..5280b5d 100644
--- a/elf_core.c
+++ b/elf_core.c
@@ -1,3 +1,19 @@
+#if defined(ELF32BIT)
+
+#define PERBIT(x) x##32
+#define ElfPERBIT(x) Elf32_##x
+#define ELFPERBIT(x) ELF32_##x
+
+#elif defined(ELF64BIT)
+
+#define PERBIT(x) x##64
+#define ElfPERBIT(x) Elf64_##x
+#define ELFPERBIT(x) ELF64_##x
+
+#else
+#  error "Undefined ELF word length"
+#endif
+
 void *PERBIT(get_section)(void *file,
                          unsigned long fsize,
                          const char *secname,
@@ -41,3 +57,6 @@ void *PERBIT(get_section)(void *file,
        return NULL;
 }
 
+#undef PERBIT
+#undef ElfPERBIT
+#undef ELFPERBIT
diff --git a/elfops.c b/elfops.c
new file mode 100644
index 0000000..550266c
--- /dev/null
+++ b/elfops.c
@@ -0,0 +1,52 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <elf.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "util.h"
+#include "logging.h"
+#include "zlibsupport.h"
+#include "elfops.h"
+
+#define ELF32BIT
+#include "elf_core.c"
+#undef ELF32BIT
+
+#define ELF64BIT
+#include "elf_core.c"
+#undef ELF64BIT
+
+/*
+ * Check ELF file header.
+ */
+int elf_ident(void *file, unsigned long fsize, int *conv)
+{
+       /* "\177ELF" <byte> where byte = 001 for 32-bit, 002 for 64 */
+       unsigned char *ident = file;
+
+       if (fsize < EI_CLASS || memcmp(file, ELFMAG, SELFMAG) != 0)
+               return -ENOEXEC;        /* Not an ELF object */
+       if (ident[EI_DATA] == 0 || ident[EI_DATA] > 2)
+               return -EINVAL;         /* Unknown endianness */
+
+       if (conv != NULL)
+               *conv = native_endianness() != ident[EI_DATA];
+       return ident[EI_CLASS];
+}
+
+void *get_section(void *file, unsigned long filesize,
+                 const char *secname, unsigned long *secsize)
+{
+       int conv;
+
+       switch (elf_ident(file, filesize, &conv)) {
+       case ELFCLASS32:
+               return get_section32(file, filesize, secname, secsize, conv);
+       case ELFCLASS64:
+               return get_section64(file, filesize, secname, secsize, conv);
+       default:
+               return NULL;
+       }
+}
diff --git a/elfops.h b/elfops.h
new file mode 100644
index 0000000..41ea8b4
--- /dev/null
+++ b/elfops.h
@@ -0,0 +1,13 @@
+#ifndef MODINITTOOLS_ELFOPS_H
+#define MODINITTOOLS_ELFOPS_H
+
+int elf_ident(void *file, unsigned long fsize, int *conv);
+void *get_section(void *file, unsigned long filesize,
+       const char *secname, unsigned long *secsize);
+void *get_section32(void *file, unsigned long filesize,
+       const char *secname, unsigned long *secsize, int conv);
+void *get_section64(void *file, unsigned long filesize,
+       const char *secname, unsigned long *secsize, int conv);
+
+#endif /* MODINITTOOLS_ELFOPS_H */
+
diff --git a/modinfo.c b/modinfo.c
index 07199c2..4f16c78 100644
--- a/modinfo.c
+++ b/modinfo.c
@@ -14,6 +14,7 @@
 #include <sys/mman.h>
 
 #include "util.h"
+#include "elfops.h"
 #include "zlibsupport.h"
 #include "testing.h"
 
diff --git a/modprobe.c b/modprobe.c
index c2d0ef6..c0680a7 100644
--- a/modprobe.c
+++ b/modprobe.c
@@ -40,6 +40,7 @@
 #include <syslog.h>
 
 #include "util.h"
+#include "elfops.h"
 #include "zlibsupport.h"
 #include "logging.h"
 #include "index.h"
diff --git a/moduleops.c b/moduleops.c
index 1ee52be..fe84c0d 100644
--- a/moduleops.c
+++ b/moduleops.c
@@ -8,6 +8,7 @@
 #include "depmod.h"
 #include "util.h"
 #include "logging.h"
+#include "elfops.h"
 #include "moduleops.h"
 #include "tables.h"
 
diff --git a/util.c b/util.c
index 482363b..54eb985 100644
--- a/util.c
+++ b/util.c
@@ -6,6 +6,7 @@
 #include <elf.h>
 #include "logging.h"
 #include "util.h"
+#include "elfops.h"
 
 /*
  * Read one logical line from a configuration file.
@@ -157,48 +158,3 @@ int __attribute__ ((pure)) native_endianness()
        return (char) *((uint32_t*)("\1\0\0\2"));
 }
 
-/*
- * Check ELF file header.
- */
-int elf_ident(void *file, unsigned long fsize, int *conv)
-{
-       /* "\177ELF" <byte> where byte = 001 for 32-bit, 002 for 64 */
-       unsigned char *ident = file;
-
-       if (fsize < EI_CLASS || memcmp(file, ELFMAG, SELFMAG) != 0)
-               return -ENOEXEC;        /* Not an ELF object */
-       if (ident[EI_DATA] == 0 || ident[EI_DATA] > 2)
-               return -EINVAL;         /* Unknown endianness */
-
-       if (conv != NULL)
-               *conv = native_endianness() != ident[EI_DATA];
-       return ident[EI_CLASS];
-}
-
-#define PERBIT(x) x##32
-#define ElfPERBIT(x) Elf32_##x
-#define ELFPERBIT(x) ELF32_##x
-#include "elf_core.c"
-
-#undef PERBIT
-#undef ElfPERBIT
-#undef ELFPERBIT
-#define PERBIT(x) x##64
-#define ElfPERBIT(x) Elf64_##x
-#define ELFPERBIT(x) ELF64_##x
-#include "elf_core.c"
-
-void *get_section(void *file, unsigned long filesize,
-                 const char *secname, unsigned long *secsize)
-{
-       int conv;
-
-       switch (elf_ident(file, filesize, &conv)) {
-       case ELFCLASS32:
-               return get_section32(file, filesize, secname, secsize, conv);
-       case ELFCLASS64:
-               return get_section64(file, filesize, secname, secsize, conv);
-       default:
-               return NULL;
-       }
-}
diff --git a/util.h b/util.h
index fbda299..cbaab72 100644
--- a/util.h
+++ b/util.h
@@ -31,14 +31,6 @@ static inline void __swap_bytes(const void *src, void *dest, 
unsigned int size)
 
 int native_endianness(void);
 
-int elf_ident(void *file, unsigned long fsize, int *conv);
-void *get_section(void *file, unsigned long filesize,
-       const char *secname, unsigned long *secsize);
-void *get_section32(void *file, unsigned long filesize,
-       const char *secname, unsigned long *secsize, int conv);
-void *get_section64(void *file, unsigned long filesize,
-       const char *secname, unsigned long *secsize, int conv);
-
 #define streq(a,b) (strcmp((a),(b)) == 0)
 #define strstarts(a,start) (strncmp((a),(start), strlen(start)) == 0)
 
-- 
1.6.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-modules" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to