diff --git a/Makefile.am b/Makefile.am index 2123ea3..05ad93a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,7 +13,6 @@ lib_LIBRARIES = libkernaux.a TESTS = \ examples/printf \ examples/printf_va \ - tests/test_elf \ tests/test_printf \ tests/test_stdlib @@ -42,6 +41,11 @@ if ENABLE_CONSOLE libkernaux_a_SOURCES += src/console.c endif +if ENABLE_ELF +libkernaux_a_SOURCES += src/elf.c +TESTS += tests/test_elf +endif + if ENABLE_MULTIBOOT2 libkernaux_a_SOURCES += \ src/multiboot2/helpers.c \ diff --git a/configure.ac b/configure.ac index 8e21252..7bb59b0 100644 --- a/configure.ac +++ b/configure.ac @@ -12,6 +12,7 @@ AC_CANONICAL_HOST AC_ARG_ENABLE([cmdline], AS_HELP_STRING([--disable-cmdline], [disable command line parser])) AC_ARG_ENABLE([console], AS_HELP_STRING([--disable-console], [disable serial console])) +AC_ARG_ENABLE([elf], AS_HELP_STRING([--disable-elf], [disable ELF utils])) AC_ARG_ENABLE([multiboot2], AS_HELP_STRING([--disable-multiboot2], [disable Multiboot 2 information parser])) AC_ARG_ENABLE([pfa], AS_HELP_STRING([--disable-pfa], [disable Page Frame Allocator])) AC_ARG_ENABLE([units], AS_HELP_STRING([--disable-units], [disable measurement units utils])) @@ -20,6 +21,7 @@ AM_CONDITIONAL([ARCH_I386], [test "$host_cpu" = i386]) AM_CONDITIONAL([ARCH_X86_64], [test "$host_cpu" = x86_64]) AM_CONDITIONAL([ENABLE_CMDLINE], [test "$enable_cmdline" != no]) AM_CONDITIONAL([ENABLE_CONSOLE], [test "$enable_console" != no]) +AM_CONDITIONAL([ENABLE_ELF], [test "$enable_elf" != no]) AM_CONDITIONAL([ENABLE_MULTIBOOT2], [test "$enable_multiboot2" != no]) AM_CONDITIONAL([ENABLE_PFA], [test "$enable_pfa" != no]) AM_CONDITIONAL([ENABLE_UNITS], [test "$enable_units" != no]) @@ -28,9 +30,10 @@ AS_IF([test "$host_cpu" = i386], [AC_DEFINE([ARCH_I386], [1], [a AS_IF([test "$host_cpu" = x86_64], [AC_DEFINE([ARCH_X86_64], [1], [architecture is x86_64])]) AS_IF([test "$enable_cmdline" != no], [AC_DEFINE([ENABLE_CMDLINE], [1], [enabled command line parser])]) AS_IF([test "$enable_console" != no], [AC_DEFINE([ENABLE_CONSOLE], [1], [enabled serial console])]) +AS_IF([test "$enable_elf" != no], [AC_DEFINE([ENABLE_ELF], [1], [enabled ELF utils])]) AS_IF([test "$enable_multiboot2" != no], [AC_DEFINE([ENABLE_MULTIBOOT2], [1], [enabled Multiboot 2 information parser])]) AS_IF([test "$enable_pfa" != no], [AC_DEFINE([ENABLE_PFA], [1], [enabled Page Frame Allocator])]) -AS_IF([test "$enable_units", != no], [AC_DEFINE([ENABLE_UNITS], [1], [enable measurement units utils])]) +AS_IF([test "$enable_units", != no], [AC_DEFINE([ENABLE_UNITS], [1], [enabled measurement units utils])]) AM_INIT_AUTOMAKE([1.9 subdir-objects -Wall -Werror]) diff --git a/include/kernaux/elf.h b/include/kernaux/elf.h index 6a5ee08..0306e57 100644 --- a/include/kernaux/elf.h +++ b/include/kernaux/elf.h @@ -72,62 +72,7 @@ typedef struct KernAux_ELF_SectionEntry KernAux_ELF_SectionTable[]; typedef struct KernAux_ELF_RelocationEntry KernAux_ELF_RelocationTable[]; -inline static bool KernAux_ELF_Header_is_valid( - const struct KernAux_ELF_Header *header -); - -bool KernAux_ELF_Header_is_valid( - const struct KernAux_ELF_Header *const header -) { - if (!( - header->magic_0x7F == 0x7F && - header->magic_E == 'E' && - header->magic_L == 'L' && - header->magic_F == 'F' && - header->header_version == 1 && - header->elf_version == 1 - )) { - return false; - } - - if (!( - header->bitness == 1 || // 32 bit - header->bitness == 2 // 64 bit - )) { - return false; - } - - if (!( - header->endianness == 1 || // Little endian - header->endianness == 2 // Big endian - )) { - return false; - } - - if (!( - header->os_abi >= 0 && - header->os_abi <= 0x12 && - header->os_abi != 0x05 - )) { - return false; - } - - if (!( - header->obj_type == 0x00 || // NONE - header->obj_type == 0x01 || // REL - header->obj_type == 0x02 || // EXEC - header->obj_type == 0x03 || // DYN - header->obj_type == 0x04 || // CORE - header->obj_type == 0xFE00 || // LOOS - header->obj_type == 0xFEFF || // HIOS - header->obj_type == 0xFF00 || // LOPROC - header->obj_type == 0xFFFF // HIPROC - )) { - return false; - } - - return true; -} +bool KernAux_ELF_Header_is_valid(const struct KernAux_ELF_Header *header); #ifdef __cplusplus } diff --git a/src/elf.c b/src/elf.c new file mode 100644 index 0000000..2d54cc7 --- /dev/null +++ b/src/elf.c @@ -0,0 +1,58 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +bool KernAux_ELF_Header_is_valid( + const struct KernAux_ELF_Header *const header +) { + if (!( + header->magic_0x7F == 0x7F && + header->magic_E == 'E' && + header->magic_L == 'L' && + header->magic_F == 'F' && + header->header_version == 1 && + header->elf_version == 1 + )) { + return false; + } + + if (!( + header->bitness == 1 || // 32 bit + header->bitness == 2 // 64 bit + )) { + return false; + } + + if (!( + header->endianness == 1 || // Little endian + header->endianness == 2 // Big endian + )) { + return false; + } + + if (!( + header->os_abi >= 0 && + header->os_abi <= 0x12 && + header->os_abi != 0x05 + )) { + return false; + } + + if (!( + header->obj_type == 0x00 || // NONE + header->obj_type == 0x01 || // REL + header->obj_type == 0x02 || // EXEC + header->obj_type == 0x03 || // DYN + header->obj_type == 0x04 || // CORE + header->obj_type == 0xFE00 || // LOOS + header->obj_type == 0xFEFF || // HIOS + header->obj_type == 0xFF00 || // LOPROC + header->obj_type == 0xFFFF // HIPROC + )) { + return false; + } + + return true; +}