[CMake] Adding CRC32 to ELF

Vincent van Beveren v.van.beveren at nikhef.nl
Mon Oct 7 11:09:32 EDT 2019


Hi Eric,

Thanks for your prompt reply.

I have been able to follow your steps up until the item, so thanks!

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

I ran into two challenges:
- The argument '$<TARGET_FILE:clb_v2_dom.elf>.crc32' should be the 
actual content of the file, and not the file itself, i.e. the calculated 
CRC value.  How to do this?
- As far as I can see, non of the previously defined linker flags are 
added to this command. Of course I can do this, but it would mean I need 
to define things twice.

Cheers,
Vincent

On 7-10-2019 at 15:55 wrote Eric Noulard:
>
>
> Le lun. 7 oct. 2019 à 14:41, Vincent van Beveren 
> <v.van.beveren at nikhef.nl <mailto: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 <mailto:v.van.beveren at nikhef.nl>
>     site  : http://www.nikhef.nl/~vincentb
>
>     -- 
>
>     Powered by www.kitware.com <http://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

-- 
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

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


More information about the CMake mailing list