Jump to content
RVicente

ANSWERED Geração do executável (ELF) em CMake

Recommended Posts

RVicente

Olá a todos,

Estou a construir uma Toolchain para cross-compiling num ARM Cortex-M4 através do CMake, usango o gcc-arm-none-eabi.
Defini o ficheiro da Toolchain com os respetivos caminhos para os compiladores, e com as flags do compilador.
 

#---------------------------------------------------------------------------------------------------------------------
# Targets
#---------------------------------------------------------------------------------------------------------------------
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
# set(CMAKE_SYSTEM_VERSION )

#---------------------------------------------------------------------------------------------------------------------
# Set compilers
#---------------------------------------------------------------------------------------------------------------------
set(CMAKE_C_COMPILER ${ARM_GCC})
set(CMAKE_CXX_COMPILER ${ARM_G++})
set(CMAKE_ASM_COMPILER ${ARM_AS})
set(CMAKE_AR ${ARM_AR})

(...)

set(CMAKE_C_FLAGS_INIT
        "-O0 -g0 \
        -mcpu=cortex-m4 \
        -mthumb \
        -mabi=aapcs \
        -Wall \
        -Wextra \
        -mfloat-abi=hard \
        -mfpu=fpv4-sp-d16 \
        -ffunction-sections \
        -fdata-sections \
        -fno-strict-aliasing \
        -fno-builtin \
        -fshort-enums"
)

set(CMAKE_ASM_FLAGS
        "-g0 \
        -mcpu=cortex-m4 \
        -mthumb \
        -mabi=aapcs \
        -mfloat-abi=hard \
        -mfpu=fpv4-sp-d16"
)

set(CMAKE_EXE_LINKER_FLAGS_INIT
        "-O0 -g0 \
        -mcpu=cortex-m4 \
        -mthumb \
        -mabi=aapcs \
        -mfloat-abi=hard \
        -mfpu=fpv4-sp-d16 \
        -Wl,--gc-sections \
        --specs=nano.specs \
        --specs=nosys.specs"
)

 

No ficheiro CMakeLists.txt tenho mais algumas definições para o compilador, e o caminho para o Linker Script, uma biblioteca construida a partir do SDK e depois o processo de linkagem:

(...)

add_executable(main main.c)
target_link_libraries(main sdk_lib)

add_custom_command(
        TARGET
            main
        POST_BUILD
        COMMAND
            ${ARM_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/main ${CMAKE_SOURCE_DIR}/main.hex
)

 

O Custom Command gera o .hex a partir do .elf gerado no add_executable().

Aparentemente está tudo a funcionar, mas quando analiso o .hex percebi que praticamente não tem informação.
Depois de alguma pesquisa percebi que o próprio .elf não tem o conteúdo que é suposto e começo a desconfiar de um possível problema. Uma vez que no processo de compilação em sistemas embebidos, os ficheiros objecto são gerados e depois linkados para construir um ficheiro final que pode ser corrido no dispositivo, desconfio que o linker não estará a ser chamado, pois os ficheiros objecto para cada source está a ser gerado.

Reparei também que na compilação, o compilador que é chamado é o expectável

  • /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc

mas o linker assume um caminho estranho, que o CMake encontrou por algum motivo

  • /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld

Naturalmente este pertence à pasta da toolchain do GCC, mas deixa-me sem saber se este funciona de igual modo ao presente na outra pasta.


Resumindo a minha questão, alguém consegue ter uma ideia do que poderá estar a acontecer quando ao ficheiro .elf não conter a informação correcta, e também esta questão do Linker?

Obrigado.

(Link para o GitHub, embora já tenha feito pequenas alterações/experiências https://github.com/NunoRVicente/cmake-arm-toolchain)

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Só me ocorre uma coisa. Uma variável de ambiente ter o PATH errado para o linker. Mas nunca usei Cmake. Foi sempre o make e nunca fiz nada para ARMs. Só mesmo para AtMegas.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
RVicente

Bom dia.
Obrigado pela resposta.

Entretanto encontrei o problema que percebi ser um pouco periférico.
O linker precisava de um ficheiro assembly que não estava a ser bem compilado com as flags corretas. Entretanto o seguinte comando resolveu o problema:
 

set_source_files_properties(${SDK_DIR}/modules/nrfx/mdk/gcc_startup_nrf52.S PROPERTIES
        COMPILE_FLAGS
           "-x assembler-with-cpp"
)

 

Obrigado!

  • Vote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.