set(
    SHELLCODE_INCLUDE_DIR
    "${CMAKE_CURRENT_BINARY_DIR}/shellcode/"
    PARENT_SCOPE
)

set(
    SHELLCODE_OUT_DIR
    ${CMAKE_CURRENT_BINARY_DIR}/shellcode
)

add_custom_command(
    OUTPUT ${SHELLCODE_OUT_DIR}/dlopen_shellcode.o
    COMMAND as --64 -o ${SHELLCODE_OUT_DIR}/dlopen_shellcode.o ./dlopen_shellcode.s
    DEPENDS ./dlopen_shellcode.s
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Assemble dlopen() shellcode (x86_64)"
)

add_custom_command(
    OUTPUT ${SHELLCODE_OUT_DIR}/dlopen_shellcode.bin
    COMMAND objcopy -j .text -O binary ${SHELLCODE_OUT_DIR}/dlopen_shellcode.o ${SHELLCODE_OUT_DIR}/dlopen_shellcode.bin
    DEPENDS ${SHELLCODE_OUT_DIR}/dlopen_shellcode.o
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Copy dlopen() shellcode to binary file (x86_64)"
)

add_custom_command(
    OUTPUT ${SHELLCODE_OUT_DIR}/dlopen_shellcode.hpp
    COMMAND python bin2cppheader.py ${SHELLCODE_OUT_DIR}/dlopen_shellcode.bin
    DEPENDS ${SHELLCODE_OUT_DIR}/dlopen_shellcode.bin
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Convert dlopen() shellcode binary to C++ header (x86_64)"
)

add_custom_target(
    shellcode
    DEPENDS ${SHELLCODE_OUT_DIR}/dlopen_shellcode.hpp
)