[CMake] Adding CRC32 to ELF

Eric Noulard eric.noulard at gmail.com
Mon Oct 7 09:55:06 EDT 2019


Le lun. 7 oct. 2019 à 14:41, Vincent van Beveren <v.van.beveren at nikhef.nl>
a écrit :

> Hello everyone,
>
> I'm setting up a new build targeting an embedded platform (LM32) and
> trying to integrate a CRC32 into the resulting ELF. I have previously
> done this using plain Makefiles with the following steps (pseudo code):
>
> target.elf: <obj-files>
>     link <obj-files> --symbol CRC_VALUE=0 intermediate.elf
>     objcopy --binary intermediate.elf intermediate.bin
>     link <obj-files> --symbol CRC_VALUE=`crc32 intermediate.bin` target.elf
>     rm intermediate.bin
>
> Now I would like to achieve the same thing with CMake. I'm using
> add_executable with multiple targets. The end of my CMakeLists.txt looks
> like this, where F_GEN contains generic source files and F__* source
> files specific for that variant of the build:
>
> # [...defining of cross compiler, and source files, some compile flags,
> etc...]
> # Educate the linker
> add_link_options(
>      -nostartfiles
>      -nodefaultlibs
>      -nostdlib
>      -Wl,--gc-sections
>      -T ${CMAKE_SOURCE_DIR}/${P_SRC}/romram.ld
>      -Wl,--defsym=CRC_VALUE=0
>      -Wl,--defsym=_start=0
>      )
>
> # DOM v2 target
> add_executable( clb_v2_dom.elf ${F_GEN} ${F__DOM} )
> target_compile_definitions(clb_v2_dom.elf PUBLIC -DDOM -DCLBV2 )
>
> # BASE v2 target
> add_executable( clb_v2_base.elf ${F_GEN} ${F__BASE} )
> # TODO migrate define 'DUBASE' -> 'BASE'
> target_compile_definitions(clb_v2_base.elf PUBLIC -DDUBASE -DBASE -DCLBV2)
>
> # Golden v2 target
> add_executable( clb_v2_golden.elf ${F_GEN} ${F__GLD} )
> target_compile_definitions( clb_v2_golden.elf PUBLIC -DGOLDEN -DCLBV2 )
>
> ==
>
> As you can see CRC_VALUE is now simply defined 0 for every target. Which
> works well for compiling but during runtime poses a problem to the ROM
> verification procedure. What would a 'proper' way be of adding a CRC to
> an ELF file be using CMake, and be different for each target. Any help
> is welcome!
>

I would try to add a set of custom command as POST_BUILD event.
https://cmake.org/cmake/help/v3.15/command/add_custom_command.html#build-events

add_custom_command(TARGET clb_v2_base.elf POST_BUILD

 COMMAND crc32 $<TARGET_FILE:clb_v2_base.elf>
> $<TARGET_FILE:clb_v2_base.elf>.crc32
                                   COMMAND ${CMAKE_C_COMPILER}
--symbol $<TARGET_FILE:clb_v2_base.elf>.crc32
 $<TARGET_FILE:clb_v2_base.elf>
                                  )

I don't know if the linker can read the computed crc32 from the previously
generated file but you get the idea.
Moreover if you want to easily collect objects used for linking a target
you may need to use an intermediate
OBJECT library in order to be able to retrieve $<TARGET_OBJECTS:objlib>
see:
https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries
i.e. replace:
add_executable( clb_v2_dom.elf ${F_GEN} ${F__DOM} )

by
add_library(clb_v2_dom.objs OBJECT ${F_GEN} ${F__DOM})
add_executable(clb_v2_dom.elf  $<TARGET_OBJECTS:clb_v2_dom.objs>)

and then:

add_custom_command(TARGET clb_v2_dom.elf POST_BUILD

 COMMAND crc32 $<TARGET_FILE:clb_v2_dom.elf>
> $<TARGET_FILE:clb_v2_dom.elf>.crc32
                                   COMMAND
${CMAKE_C_COMPILER} $<TARGET_OBJECTS:clb_v2_dom.objs>
--symbol $<TARGET_FILE:clb_v2_dom.elf>.crc32  $<TARGET_FILE:clb_v2_dom.elf>
                                  )

If this looks ok to you I would then write my own

lm32_add_executable that would wraps this up in order to be called as:

lm32_add_executable(EXECUTABLE clb_v2_dom.elf
                                 SOURCES ${F_GEN} ${F__DOM})




> Kind regards,
> Vincent
>
>
>
> --
> National Institute for Subatomic Physics Nikhef
> Department of Computer Technology
> Science Park 105
> 1098 XG AMSTERDAM
>
> tel.  : +31 (0)20 592 2032
> e-mail: v.van.beveren at nikhef.nl
> site  : http://www.nikhef.nl/~vincentb
>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>


-- 
Eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20191007/d241ac8e/attachment.html>


More information about the CMake mailing list