首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ASM编译ASM和C进行调试

用ASM编译ASM和C进行调试
EN

Stack Overflow用户
提问于 2018-03-06 13:28:41
回答 1查看 7.5K关注 0票数 7

我有两个小文件要在CMake中编译,以便用CLion和GDB调试它。

main.c

代码语言:javascript
复制
int my_strlen(char *);

int main()
{
    printf("Test: %d\n", my_strlen("Hello"));
}

我的ASM文件有一个my_strlen文件

代码语言:javascript
复制
    [BITS 64]

    global my_strlen
    section .text

my_strlen:
    push rbp
    mov rbp, rsp
    xor rcx, rcx

loop:
    cmp BYTE [rdi + rcx], 0
    jz end
    inc rcx
    jmp loop

end:
    mov rax, rcx
    mov rsp, rbp
    leave
    ret

我试图用一个CMakeList.txt编译,我添加了set_source_files_properties,但是它仍然不能工作

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.9)
project(ASM)

set(CMAKE_CXX_STANDARD 11)
set_source_files_properties(src/strlen.asm PROPERTIES COMPILE_FLAGS "-x assembler-with-c")

add_executable(main
        src/strlen.asm
        tests/src/main.c)

有人知道一个很好的命令,可以在C项目中添加ASM文件并使用CMakeList.txt编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-06 15:38:19

您可能需要使用enable_language(ASM_NASM)在CMAKE中启用NASM支持,然后设置适当的组装选项:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.9)
project(ASM)
enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> \
    <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")

set_source_files_properties(src/strlen.asm PROPERTIES COMPILE_FLAGS "-g -Fdwarf")

set(CMAKE_CXX_STANDARD 11)

add_executable(main
        src/strlen.asm
        tests/src/main.c)

由于您的代码似乎是64位目标,所以我基本上将-f elf64作为命令行选项传递给NASM。我将格式类型放在它自己的环境变量CMAKE_ASM_NASM_OBJECT_FORMAT中。要在NASM中启用调试信息,可以使用-g -Fdwarf

如果执行调试和发布版本,您可以检查构建类型并相应地设置标志,如下所示:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.9)
project(ASM)
enable_language(ASM_NASM)

set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> \
    <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_ASM_NASM_FLAGS "${ASM_NASM_FLAGS} -g -Fdwarf")
else()
    set(CMAKE_ASM_NASM_FLAGS "${ASM_NASM_FLAGS}")
endif()

set(CMAKE_CXX_STANDARD 11)

add_executable(main
        src/strlen.asm
        tests/src/main.c)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49131996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档