diff --git a/.travis.yml b/.travis.yml index 3a3380b..30e0bcc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -94,4 +94,7 @@ script: cmake .. make VERBOSE=1 ./b25 2>&1 | grep --color=auto "ARIB STD-B25" + if [ "${TRAVIS_OS_NAME}" != "osx" ]; then + ./libarib25.so 2>&1 | grep --color=auto "ARIB STD-B25" + fi EOF diff --git a/CMakeLists.txt b/CMakeLists.txt index 734c672..f75a6c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,8 +46,11 @@ if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") set(CMAKE_SHARED_LINKER_FLAGS "-fvisibility=hidden") if(UNIX AND NOT CYGWIN) + include(ElfInterp) set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -eshow_version") + if(NOT APPLE) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-eshow_version") + endif() else(MINGW) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-stdcall-fixup -static-libgcc") endif() diff --git a/cmake/ElfInterp.cmake b/cmake/ElfInterp.cmake new file mode 100644 index 0000000..058cda3 --- /dev/null +++ b/cmake/ElfInterp.cmake @@ -0,0 +1,19 @@ + +find_program(OBJCOPY_EXECUTABLE "objcopy") +if(OBJCOPY_EXECUTABLE) + set(ELF_INTERP_BIN ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/elf_interp) + set(ELF_INTERP_SRC ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/elf_interp.c) + set(ELF_INTERP_DAT ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/elf_interp.dat) + + file(WRITE ${ELF_INTERP_SRC} "int main(int argc, char **argv) { return 0; }") + + execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} -o ${ELF_INTERP_BIN} ${ELF_INTERP_SRC}) + execute_process(COMMAND ${OBJCOPY_EXECUTABLE} -O binary --only-section=.interp ${ELF_INTERP_BIN} ${ELF_INTERP_DAT}) + + if(EXISTS ${ELF_INTERP_DAT}) + file(READ ${ELF_INTERP_DAT} ELF_INTERP) + string(STRIP ${ELF_INTERP} ELF_INTERP) + endif() +endif() + +message(STATUS "ELF Interpreter: ${ELF_INTERP}") diff --git a/src/config.h.in b/src/config.h.in index e8651d6..370f728 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -12,4 +12,6 @@ #define BUILD_CC_VERSION "@CMAKE_C_COMPILER_VERSION@" #define BUILD_GIT_REVISION "@GIT_REVISION@" +#define ELF_INTERP "@ELF_INTERP@" + #endif /* CONFIG_H */ diff --git a/src/version.c b/src/version.c index b6d243a..1c1c21e 100644 --- a/src/version.c +++ b/src/version.c @@ -3,17 +3,13 @@ #if defined(__GNUC__) || defined(__clang__) # if !defined(__APPLE__) -# if defined(__x86_64__) -const char elf_interp[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2"; -# else -const char elf_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; -# endif +const char elf_interp[] __attribute__((section(".interp"))) = ELF_INTERP; # endif #include void show_version(void) { - fprintf(stderr, "libarib25.so - ARIB-STD B25 shared library version %s (%s)\n", ARIB25_VERSION_STRING, BUILD_GIT_REVISION); + fprintf(stderr, "libarib25.so - ARIB STD-B25 shared library version %s (%s)\n", ARIB25_VERSION_STRING, BUILD_GIT_REVISION); fprintf(stderr, " built with %s %s on %s\n", BUILD_CC_NAME, BUILD_CC_VERSION, BUILD_OS_NAME); _exit(0); }