Library Compiler and Flags

This document contains the compiler version and flags used to build a static library for use with fingerprint. The flags and versions correspond to the version of LLVM and flags in use on Sept 19, 2023.

Toolchain

Fingerprint currently uses clang version 17.0.0 and newlib version 4.1.0.

Please use toolchain available within the ChromiumOS SDK chroot. See the ChromiumOS Developer Guide for instructions on how to set it up.

  • Prerequisites (most important is depot_tools)
  • Get the Source
  • Create a chroot
  • Run cros_sdk from within ~/chromiumos. The compiler armv7m-cros-eabi-clang is available within this chroot.

Compiler Flags

Bloonchipper (libbep)

armv7m-cros-eabi-clang -mcpu=cortex-m4

Dartmonkey (libfp)

armv7m-cros-eabi-clang -mcpu=cortex-m7

Common Flags

-mthumb
-mfloat-abi=hard
-mno-unaligned-access
-std=gnu11
# Reduce code size.
# https://crrev.com/c/3199737
-Oz
-g

# Decrease code size by reducing inlining.
# https://crrev.com/c/4545442
-Wl,-mllvm -Wl,-inline-threshold=-10

# Add ability to remove unused code at link time.
# https://stackoverflow.com/q/6687630
# https://crrev.com/c/189224
-ffunction-sections
# Generate traps for signed overflow on addition, subtraction, multiplication
# operations.
# https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-ftrapv
# https://crrev.com/c/4007158
-ftrapv
-fno-PIC
-fno-asynchronous-unwind-tables
-fno-common
-fno-delete-null-pointer-checks
-fno-exceptions
-fno-strict-aliasing
-fno-strict-overflow
-fno-unwind-tables

-Wall
-Werror
-Werror-implicit-function-declaration
-Werror=uninitialized
-Wimplicit-fallthrough
-Wno-address-of-packed-member
-Wno-format-security
-Wno-ignored-attributes
-Wno-pointer-sign
-Wno-trigraphs
-Wno-unused-function
-Wstrict-prototypes
-Wundef

LTO Enable Flags

If we compile with CONFIG_LTO enabled. the following flag is added to compiler and linker here:

# https://crrev.com/c/271291
-flto

Example C Compilation Line

# The above arguments are from the following build command on Sep 19, 2023:
make BOARD=dartmonkey V=1 build/dartmonkey/RW/core/cortex-m/mpu.o
# Output removed, since it is similar to bloonchipper.
make BOARD=bloonchipper V=1 build/bloonchipper/RW/core/cortex-m/mpu.o
# Output (with private paths stripped):
/usr/bin/ccache armv7m-cros-eabi-clang -std=gnu11 -Wstrict-prototypes -Wno-pointer-sign -Werror-implicit-function-declaration -Wno-ignored-attributes -DOUTDIR=build/bloonchipper/RW -DCHIP=stm32 -DBOARD_TASKFILE=ec.tasklist -DBOARD=bloonchipper -DCORE=cortex-m -DPROJECT=ec -DCHIP_VARIANT=stm32f412 -DCHIP_FAMILY=STM32F4 -DBOARD_BLOONCHIPPER= -DCHIP_STM32= -DCORE_CORTEX_M= -DCHIP_VARIANT_STM32F412= -DCHIP_FAMILY_STM32F4= -DFINAL_OUTDIR=build/bloonchipper -DPROTOBUF_MIN_PROTOC_VERSION=0  -Iinclude  -Icore/cortex-m/include  -Iinclude/driver  -Icore/cortex-m  -Ichip/stm32  -Iboard/bloonchipper  -Iboard/bloonchipper  -Icommon  -Ifuzz  -Ipower  -Itest  -Icts/common  -Icts/  -Ibuild/bloonchipper/gen  -Iprivate  -Icommon  -Icommon/fpsensor  -Icommon/vboot  -Icommon/spi  -Icommon/spi/flash_reg  -Icommon/spi/flash_reg/private  -Icommon/spi/flash_reg/src  -Icommon/spi/flash_reg/public  -Icommon/usbc  -Icommon/mock  -Idriver  -Idriver/ioexpander  -Idriver/retimer  -Idriver/temp_sensor  -Idriver/sha256  -Idriver/cec  -Idriver/bc12  -Idriver/nfc  -Idriver/led  -Idriver/usb_mux  -Idriver/fingerprint  -Idriver/fingerprint/elan  -Idriver/fingerprint/fpc  -Idriver/fingerprint/fpc/libfp  -Idriver/fingerprint/fpc/bep  -Idriver/ppc  -Idriver/charger  -Idriver/battery  -Idriver/tcpm  -Idriver/wpc  -Ilibc  -Ithird_party/boringssl/common  -Icrypto  -Ibuild/bloonchipper  -Ifuzz  -Itest  -Ithird_party  -Ispi/flash_regpublic   -I.    -DTEST_ec= -DTEST_EC=        -Iinclude/driver  -DSECTION_IS_RW= -DSECTION=RW -DHAS_TASK_FPSENSOR= -DHAS_TASK_RWSIG_RO= -fno-PIC -DCHROMIUM_EC= -DHAVE_PRIVATE -DHAS_TASK_HOOKS= -DHAS_TASK_HOSTCMD= -DHAS_TASK_CONSOLE=  -I../../third_party/boringssl -I../../third_party/boringssl/include -I/mnt/host/source/src/platform/ec/third_party/boringssl/include -D__TRUSTY__ -mcpu=cortex-m4 -mcpu=cortex-m4 -mthumb -Oz      -Wl,-mllvm -Wl,-inline-threshold=-10 -mno-unaligned-access -mfloat-abi=hard -g  -ftrapv -Wall -Wundef -Wno-trigraphs -Wno-format-security -Wno-address-of-packed-member -fno-common -fno-strict-aliasing -fno-strict-overflow -Wimplicit-fallthrough -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -Werror -Werror=uninitialized -Wno-unused-function  -ffunction-sections -fno-delete-null-pointer-checks -fno-PIC -MMD -MP -MF build/bloonchipper/RW/core/cortex-m/mpu.o.d -c core/cortex-m/mpu.c -MT build/bloonchipper/RW/core/cortex-m/mpu.o -o build/bloonchipper/RW/core/cortex-m/mpu.o

The linking step to create RO/ec.RO.elf and RW/ec.RW.elf:

# Output (with private paths stripped):
armv7m-cros-eabi-clang++ build/bloonchipper/RO/board/bloonchipper/board.o build/bloonchipper/RO/board/bloonchipper/fpsensor_detect.o build/bloonchipper/RO/chip/stm32/bkpdata.o build/bloonchipper/RO/chip/stm32/clock-f.o build/bloonchipper/RO/chip/stm32/clock-stm32f4.o build/bloonchipper/RO/chip/stm32/dma-stm32f4.o build/bloonchipper/RO/chip/stm32/flash-f.o build/bloonchipper/RO/chip/stm32/flash-stm32f4.o build/bloonchipper/RO/chip/stm32/fpu.o build/bloonchipper/RO/chip/stm32/gpio-stm32f4.o build/bloonchipper/RO/chip/stm32/gpio.o build/bloonchipper/RO/chip/stm32/host_command_common.o build/bloonchipper/RO/chip/stm32/hwtimer32.o build/bloonchipper/RO/chip/stm32/otp-stm32f4.o build/bloonchipper/RO/chip/stm32/spi.o build/bloonchipper/RO/chip/stm32/spi_controller.o build/bloonchipper/RO/chip/stm32/system.o build/bloonchipper/RO/chip/stm32/trng.o build/bloonchipper/RO/chip/stm32/uart.o build/bloonchipper/RO/chip/stm32/usart-stm32f4.o build/bloonchipper/RO/chip/stm32/usart.o build/bloonchipper/RO/chip/stm32/usart_host_command.o build/bloonchipper/RO/chip/stm32/usart_rx_dma.o build/bloonchipper/RO/chip/stm32/usart_rx_interrupt-stm32f4.o build/bloonchipper/RO/chip/stm32/usart_tx_dma.o build/bloonchipper/RO/chip/stm32/usart_tx_interrupt.o build/bloonchipper/RO/chip/stm32/watchdog.o build/bloonchipper/RO/common/console.o build/bloonchipper/RO/common/console_output.o build/bloonchipper/RO/common/ec_features.o build/bloonchipper/RO/common/extpower_common.o build/bloonchipper/RO/common/flash.o build/bloonchipper/RO/common/fmap.o build/bloonchipper/RO/common/fpsensor/fpsensor_detect_strings.o build/bloonchipper/RO/common/gettimeofday.o build/bloonchipper/RO/common/gpio.o build/bloonchipper/RO/common/gpio_commands.o build/bloonchipper/RO/common/hooks.o build/bloonchipper/RO/common/host_command.o build/bloonchipper/RO/common/host_command_task.o build/bloonchipper/RO/common/host_event_commands.o build/bloonchipper/RO/common/irq_locking.o build/bloonchipper/RO/common/main.o build/bloonchipper/RO/common/memory_commands.o build/bloonchipper/RO/common/mkbp_event.o build/bloonchipper/RO/common/mkbp_fifo.o build/bloonchipper/RO/common/panic_output.o build/bloonchipper/RO/common/peripheral.o build/bloonchipper/RO/common/printf.o build/bloonchipper/RO/common/queue.o build/bloonchipper/RO/common/queue_policies.o build/bloonchipper/RO/common/rollback.o build/bloonchipper/RO/common/rsa.o build/bloonchipper/RO/common/rwsig.o build/bloonchipper/RO/common/sha256.o build/bloonchipper/RO/common/shared_mem_libc.o build/bloonchipper/RO/common/system.o build/bloonchipper/RO/common/system_boot_time.o build/bloonchipper/RO/common/timer.o build/bloonchipper/RO/common/trng.o build/bloonchipper/RO/common/uart_buffering.o build/bloonchipper/RO/common/uart_hostcmd.o build/bloonchipper/RO/common/uart_printf.o build/bloonchipper/RO/common/uptime.o build/bloonchipper/RO/common/usb_pd_flags.o build/bloonchipper/RO/common/util.o build/bloonchipper/RO/common/vboot/common.o build/bloonchipper/RO/common/vboot/vb21_lib.o build/bloonchipper/RO/common/version.o build/bloonchipper/RO/core/cortex-m/cpu.o build/bloonchipper/RO/core/cortex-m/debug.o build/bloonchipper/RO/core/cortex-m/fpu.o build/bloonchipper/RO/core/cortex-m/init.o build/bloonchipper/RO/core/cortex-m/mpu.o build/bloonchipper/RO/core/cortex-m/panic.o build/bloonchipper/RO/core/cortex-m/switch.o build/bloonchipper/RO/core/cortex-m/task.o build/bloonchipper/RO/core/cortex-m/vecttable.o build/bloonchipper/RO/core/cortex-m/watchdog.o build/bloonchipper/RO/crypto/elliptic_curve_key.o build/bloonchipper/RO/libc/syscalls.o build/bloonchipper/RO/third_party/boringssl/common/sysrand.o  -g -no-pie -Wl,-X -Wl,--gc-sections -Wl,--build-id=none -lclang_rt.builtins-armv7m -Lbuild/bloonchipper/third_party/boringssl/crypto -lcrypto -mcpu=cortex-m4 -mcpu=cortex-m4 -mthumb -Oz        -Wl,-mllvm -Wl,-inline-threshold=-10 -mno-unaligned-access -mfloat-abi=hard -lnosys -o build/bloonchipper/RO/ec.RO.elf -Wl,-T,build/bloonchipper/RO/ec.RO.lds -Wl,-Map,build/bloonchipper/RO/ec.RO.map
# Output (with private paths stripped):
armv7m-cros-eabi-clang++ build/bloonchipper/RW/board/bloonchipper/board.o build/bloonchipper/RW/board/bloonchipper/board_rw.o build/bloonchipper/RW/board/bloonchipper/fpsensor_detect.o build/bloonchipper/RW/board/bloonchipper/fpsensor_detect_rw.o build/bloonchipper/RW/chip/stm32/bkpdata.o build/bloonchipper/RW/chip/stm32/clock-f.o build/bloonchipper/RW/chip/stm32/clock-stm32f4.o build/bloonchipper/RW/chip/stm32/dma-stm32f4.o build/bloonchipper/RW/chip/stm32/flash-f.o build/bloonchipper/RW/chip/stm32/flash-stm32f4.o build/bloonchipper/RW/chip/stm32/fpu.o build/bloonchipper/RW/chip/stm32/gpio-stm32f4.o build/bloonchipper/RW/chip/stm32/gpio.o build/bloonchipper/RW/chip/stm32/host_command_common.o build/bloonchipper/RW/chip/stm32/hwtimer32.o build/bloonchipper/RW/chip/stm32/otp-stm32f4.o build/bloonchipper/RW/chip/stm32/spi.o build/bloonchipper/RW/chip/stm32/spi_controller.o build/bloonchipper/RW/chip/stm32/system.o build/bloonchipper/RW/chip/stm32/trng.o build/bloonchipper/RW/chip/stm32/uart.o build/bloonchipper/RW/chip/stm32/usart-stm32f4.o build/bloonchipper/RW/chip/stm32/usart.o build/bloonchipper/RW/chip/stm32/usart_host_command.o build/bloonchipper/RW/chip/stm32/usart_rx_dma.o build/bloonchipper/RW/chip/stm32/usart_rx_interrupt-stm32f4.o build/bloonchipper/RW/chip/stm32/usart_tx_dma.o build/bloonchipper/RW/chip/stm32/usart_tx_interrupt.o build/bloonchipper/RW/chip/stm32/watchdog.o build/bloonchipper/RW/common/console.o build/bloonchipper/RW/common/console_output.o build/bloonchipper/RW/common/ec_features.o build/bloonchipper/RW/common/extpower_common.o build/bloonchipper/RW/common/flash.o build/bloonchipper/RW/common/fmap.o build/bloonchipper/RW/common/fpsensor/fpsensor.o build/bloonchipper/RW/common/fpsensor/fpsensor_auth_commands.o build/bloonchipper/RW/common/fpsensor/fpsensor_auth_crypto_stateful.o build/bloonchipper/RW/common/fpsensor/fpsensor_auth_crypto_stateless.o build/bloonchipper/RW/common/fpsensor/fpsensor_crypto.o build/bloonchipper/RW/common/fpsensor/fpsensor_debug.o build/bloonchipper/RW/common/fpsensor/fpsensor_detect_strings.o build/bloonchipper/RW/common/fpsensor/fpsensor_state.o build/bloonchipper/RW/common/fpsensor/fpsensor_state_without_driver_info.o build/bloonchipper/RW/common/gettimeofday.o build/bloonchipper/RW/common/gpio.o build/bloonchipper/RW/common/gpio_commands.o build/bloonchipper/RW/common/hooks.o build/bloonchipper/RW/common/host_command.o build/bloonchipper/RW/common/host_command_task.o build/bloonchipper/RW/common/host_event_commands.o build/bloonchipper/RW/common/irq_locking.o build/bloonchipper/RW/common/main.o build/bloonchipper/RW/common/memory_commands.o build/bloonchipper/RW/common/mkbp_event.o build/bloonchipper/RW/common/mkbp_fifo.o build/bloonchipper/RW/common/panic_output.o build/bloonchipper/RW/common/peripheral.o build/bloonchipper/RW/common/printf.o build/bloonchipper/RW/common/queue.o build/bloonchipper/RW/common/queue_policies.o build/bloonchipper/RW/common/rollback.o build/bloonchipper/RW/common/sha256.o build/bloonchipper/RW/common/shared_mem_libc.o build/bloonchipper/RW/common/spi_commands.o build/bloonchipper/RW/common/system.o build/bloonchipper/RW/common/system_boot_time.o build/bloonchipper/RW/common/timer.o build/bloonchipper/RW/common/trng.o build/bloonchipper/RW/common/uart_buffering.o build/bloonchipper/RW/common/uart_hostcmd.o build/bloonchipper/RW/common/uart_printf.o build/bloonchipper/RW/common/uptime.o build/bloonchipper/RW/common/usb_pd_flags.o build/bloonchipper/RW/common/util.o build/bloonchipper/RW/common/vboot/vb21_lib.o build/bloonchipper/RW/common/version.o build/bloonchipper/RW/core/cortex-m/cpu.o build/bloonchipper/RW/core/cortex-m/debug.o build/bloonchipper/RW/core/cortex-m/fpu.o build/bloonchipper/RW/core/cortex-m/init.o build/bloonchipper/RW/core/cortex-m/mpu.o build/bloonchipper/RW/core/cortex-m/panic.o build/bloonchipper/RW/core/cortex-m/switch.o build/bloonchipper/RW/core/cortex-m/task.o build/bloonchipper/RW/core/cortex-m/vecttable.o build/bloonchipper/RW/core/cortex-m/watchdog.o build/bloonchipper/RW/crypto/elliptic_curve_key.o build/bloonchipper/RW/driver/fingerprint/fpc/bep/fpc_misc.o build/bloonchipper/RW/driver/fingerprint/fpc/bep/fpc_private.o build/bloonchipper/RW/driver/fingerprint/fpc/bep/fpc_sensor_spi.o build/bloonchipper/RW/driver/fingerprint/fpc/bep/fpc_timebase.o build/bloonchipper/RW/driver/fingerprint/fpc/fpc_sensor.o build/bloonchipper/RW/libc/syscalls.o build/bloonchipper/RW/third_party/boringssl/common/sysrand.o  -g -no-pie -Wl,-X -Wl,--gc-sections -Wl,--build-id=none -lclang_rt.builtins-armv7m -Lbuild/bloonchipper/libsharedobjs/private -lfpbep -Lbuild/bloonchipper/third_party/boringssl/crypto -lcrypto -mcpu=cortex-m4 -mcpu=cortex-m4 -mthumb -Oz      -Wl,-mllvm -Wl,-inline-threshold=-10 -mno-unaligned-access -mfloat-abi=hard -lnosys -o build/bloonchipper/RW/ec.RW.elf -Wl,-T,build/bloonchipper/RW/ec.RW.lds -Wl,-Map,build/bloonchipper/RW/ec.RW.map

Final linking to combine RO/ec.RO.elf and RW/ec.RW.elf into ec.obj:

# Output (with private paths stripped):
/usr/bin/ccache armv7m-cros-eabi-clang -Wl,-T build/bloonchipper/firmware_image.lds -nostdlib -DOUTDIR=build/bloonchipper/ -DCHIP=stm32 -DBOARD_TASKFILE=ec.tasklist -DBOARD=bloonchipper -DCORE=cortex-m -DPROJECT=ec -DCHIP_VARIANT=stm32f412 -DCHIP_FAMILY=STM32F4 -DBOARD_BLOONCHIPPER= -DCHIP_STM32= -DCORE_CORTEX_M= -DCHIP_VARIANT_STM32F412= -DCHIP_FAMILY_STM32F4= -DFINAL_OUTDIR=build/bloonchipper -DPROTOBUF_MIN_PROTOC_VERSION=0  -Iinclude  -Icore/cortex-m/include  -Iinclude/driver  -Icore/cortex-m  -Ichip/stm32  -Iboard/bloonchipper  -Iboard/bloonchipper  -Icommon  -Ifuzz  -Ipower  -Itest  -Icts/common  -Icts/  -Ibuild/bloonchipper/gen  -Iprivate  -Icommon  -Icommon/fpsensor  -Icommon/vboot  -Icommon/spi  -Icommon/spi/flash_reg  -Icommon/spi/flash_reg/private  -Icommon/spi/flash_reg/src  -Icommon/spi/flash_reg/public  -Icommon/usbc  -Icommon/mock  -Idriver  -Idriver/ioexpander  -Idriver/retimer  -Idriver/temp_sensor  -Idriver/sha256  -Idriver/cec  -Idriver/bc12  -Idriver/nfc  -Idriver/led  -Idriver/usb_mux  -Idriver/fingerprint  -Idriver/fingerprint/elan  -Idriver/fingerprint/fpc  -Idriver/fingerprint/fpc/libfp  -Idriver/fingerprint/fpc/bep  -Idriver/ppc  -Idriver/charger  -Idriver/battery  -Idriver/tcpm  -Idriver/wpc  -Ilibc  -Ithird_party/boringssl/common  -Icrypto  -Ibuild/bloonchipper  -Ifuzz  -Itest  -Ithird_party  -Ispi/flash_regpublic  -I.    -DTEST_ec= -DTEST_EC=        -Iinclude/driver  -DSECTION_IS_= -DSECTION=  -fno-PIC -DCHROMIUM_EC= -DHAVE_PRIVATE -DHAS_TASK_HOOKS= -DHAS_TASK_HOSTCMD= -DHAS_TASK_CONSOLE=  -I../../third_party/boringssl -I../../third_party/boringssl/include -I/mnt/host/source/src/platform/ec/third_party/boringssl/include -D__TRUSTY__ -mcpu=cortex-m4 -mcpu=cortex-m4 -mthumb -Oz      -Wl,-mllvm -Wl,-inline-threshold=-10 -mno-unaligned-access -mfloat-abi=hard -g  -ftrapv -Wall -Wundef -Wno-trigraphs -Wno-format-security -Wno-address-of-packed-member -fno-common -fno-strict-aliasing -fno-strict-overflow -Wimplicit-fallthrough -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -Werror -Werror=uninitialized -Wno-unused-function  -ffunction-sections -fno-delete-null-pointer-checks -fno-PIC -Wl,--build-id=none -o build/bloonchipper/ec.obj common/firmware_image.S

Exact Clang/LLVM Version

armv7m-cros-eabi-clang --version
# Output:
Chromium OS 17.0_pre496208_p20230501-r26 clang version 17.0.0 (/mnt/host/source/src/third_party/llvm-project 98f5a340975bc00197c57e39eb4ca26e2da0e8a2)
Target: armv7m-cros-unknown-eabi
Thread model: posix
InstalledDir: /usr/bin