ELF インタープリタの自動検出に対応

This commit is contained in:
Takuya Sawada 2017-12-17 19:25:46 +09:00
parent 3de91ec58b
commit 052596dbb6
4 changed files with 23 additions and 5 deletions

View File

@ -42,6 +42,7 @@ 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")
else(MINGW)

19
cmake/ElfInterp.cmake Normal file
View File

@ -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}")

View File

@ -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 */

View File

@ -3,11 +3,7 @@
#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 <unistd.h>