Using arm-none-eabi-gcc for Cortex-M4 (an application for baremetal), the code for malloc also emitted even though I never use malloc in my code.
Having seen the assembly output with arm-none-eabi-objdump -xS obj.elf , it seems that malloc is __register_exitproc called by __register_exitproc called by atexit called by register_fini
004036a8 <register_fini>: 4036a8: 4b02 ldr r3, [pc, #8] ; (4036b4 <register_fini+0xc>) 4036aa: b113 cbz r3, 4036b2 <register_fini+0xa> 4036ac: 4802 ldr r0, [pc, #8] ; (4036b8 <register_fini+0x10>) 4036ae: f000 b805 bw 4036bc <atexit> 4036b2: 4770 bx lr 4036b4: 00000000 .word 0x00000000 4036b8: 004036c9 .word 0x004036c9
However, register_fini never called in code. main() is called using the following startup code, so even if the main outputs, destructors (or functions registered with atexit() ) are not called.
void Reset_Handler(void) { uint32_t *pSrc, *pDest; pSrc = &_etext; pDest = &_srelocate; if (pSrc > pDest) { for (; pDest < &_erelocate;) { *pDest++ = *pSrc++; } } else if (pSrc < pDest) { uint32_t nb_bytes = (uint32_t)&_erelocate - (uint32_t)&_srelocate; pSrc = (uint32_t*)((uint32_t)pSrc + nb_bytes) - 1; pDest = (uint32_t*)((uint32_t)pDest + nb_bytes) - 1; for (;nb_bytes;nb_bytes -= 4) { *pDest-- = *pSrc--; } } __NOP(); for (pDest = &_szero; pDest < &_ezero;) { *pDest++ = 0; } pSrc = (uint32_t *) & _sfixed; SCB->VTOR = ((uint32_t) pSrc); __libc_init_array(); main(); while (1); }
The code is compiled with -ffunction-sections and -fdata-sections and linked to the --gc-sections flag, so any unreachable code / functions are not included in the output file.
So, how can I prevent these functions ( register_fini , atexit , malloc , etc.) that are never used in my code to be included in an object file?
Compilation options
arm-none-eabi-gcc -o build/main.o -c -mcpu=cortex-m4 -mthumb -pipe -g3 -Wall -Wextra -Wno-expansion-to-defined -Werror -std=gnu11 -fno-strict-aliasing -ffunction-sections -fdata-sections -DARM_MATH_CM4=true -D__SAM4SD32C__ -Ibunch -Iof -Iinclude -Idirs src/main.c
Link Options
arm-none-eabi-g++ -o build/tnc.elf -mcpu=cortex-m4 -mthumb -pipe -Wl,--entry=Reset_Handler -Wl,--gc-sections -Wl,--script my/linker/script.ld build/src/bunch.o build/src/of.o build/src/object.o build/src/files.o build/src/main.o -lm