繁体   English   中英

如何从 cmake 中的 linker 标志中删除此 gcc 标志?

[英]How can remove this gcc flags from linker flags in cmake?

我制作了简单的 kernel 用于学习目的。 我将 MakeFile 转换为 CMakeLists.txt 以自动分类我的 kernel 表单源。 但是我遇到了这个重定位错误。

/usr/bin/ld: CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/multiboot2_boot32.asm.o: relocation R_X86_64_32 against `.boot.32' can not be used when making a PIE object; recompile with -fPIE

为了解决这个问题,我想我必须删除 linker 标志中的 -fno-pie 。 通过使用 make VERBOSE=1 检查 gcc 的日志,我可以发现在我的 linker 标志中有 CMAKE_CXX_FLAGS。

[100%] Linking CXX executable x86_64-kernel.bin
/usr/bin/cmake -E cmake_link_script CMakeFiles/x86_64-kernel.bin.dir/link.txt --verbose=1
/usr/bin/gcc   -mno-red-zone -mcmodel=large -mno-sse -ffreestanding -nostdlib -fno-pie -fno-pic  -rdynamic -n -T /home/ahn9807/study/AOS/src/arch/x86_64/linker.ld CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/kernel_entry.cpp.o CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/multiboot2_boot32.asm.o CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/multiboot2_boot64.asm.o CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/multiboot2_header.asm.o  -o x86_64-kernel.bin 
/usr/bin/ld: CMakeFiles/x86_64-kernel.bin.dir/src/arch/x86_64/multiboot2_boot32.asm.o: relocation R_X86_64_32 against `.boot.32' can not be used when making a PIE object; recompile with -fPIE

如何在我的 LINKER_FLAGS 中删除此 CMAKE_CXX_FLAGS? 为什么 camke 会自动为我的 MakeFile 插入这个无用的选项? 有没有其他方法可以绕过此错误消息? 我希望你的答案......这是我的 CMakeLists.txt。

cmake_minimum_required(VERSION 2.17)

project(kernell)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 1)

set(CMAKE_CXX_STANDAED 17)

set(KERNEL_BIN "x86_64-kernel.bin")

set(CMAKE_BINARY_DIR ${PROJECT_SOURCE_DIR}/build)
set(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/src/arch/x86_64/linker.ld)
set(GRUB_CFG ${PROJECT_SOURCE_DIR}/src/arch/x86_64/grub.cfg)

set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf64")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-red-zone -mcmodel=large -mno-sse -ffreestanding -nostdlib -fno-pie -fno-pic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mno-red-zone -mcmodel=large -mno-sse -ffreestanding -nostdlib -fno-pie -fno-pic")
set(CMAKE_ASM_FLAGS "{CMAKE_ASM_FLAGS} -felf64")

set(CMAKE_CXX_COMPILER "/usr/bin/gcc")
set(CMAKE_C_COMPILER "/usr/bin/g++")
set(CMAKE_LINKER "/usr/bin/ld")

enable_language(ASM_NASM)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/include/
)

add_executable(
    ${KERNEL_BIN}

    # Header files
    include/arch/x86_64/kernel_entry.h
    include/arch/x86_64/vga_text.h
    include/arch/x86_64/multiboot2.h

    # Source files
    src/arch/x86_64/kernel_entry.cpp
    src/arch/x86_64/multiboot2_boot32.asm
    src/arch/x86_64/multiboot2_boot64.asm
    src/arch/x86_64/multiboot2_header.asm
)

set_target_properties(${KERNEL_BIN} PROPERTIES LINK_FLAGS "-n -T ${LINKER_SCRIPT}")

add_custom_command(TARGET ${KERNEL_BIN} POST_BUILD
    COMMAND mkdir -p ${CMAKE_BINARY_DIR}/build/isofiles/boot/grub
    COMMAND cp ${KERNEL_BIN} ${CMAKE_BINARY_DIR}/build/isofiles/boot/${KERNEL_BIN}
    COMMAND cp ${GRUB_CFG} ${CMAKE_BINARY_DIR}/build/isofiles/boot/grub
    COMMAND grub-mkrescue -o kernel.iso ${CMAKE_BINARY_DIR}/build/isofiles
    COMMAND rm -r ${CMAKE_BINARY_DIR}/build/
)

最后我弄清楚如何从 cmake 中删除无用的 linker 参数。 CMAKE 使用编译器作为默认 linker。 在我的例子中,gcc 是默认的 linker,因为我使用 gcc 构建我的源代码。 重要的事实是cmake 在链接阶段也带有 gcc 的 CMAKE_CXX_FLAGS 所以我们必须像这样使用自定义 linker 以避免 cmake 将我们的 oject 文件与默认编译器 linker 链接。

set(CMAKE_LINKER "/usr/bin/ld")
set(CMAKE_LINKER_FLAGS "-n -T ${LINKER_SCRIPT}")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> ${CMAKE_LINKER_FLAGS} <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

这样我们就可以用自定义的linker自动生成可执行文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM