gpt4 book ai didi

c - 如何防止包含 C 库析构函数和 atexit()?

转载 作者:太空狗 更新时间:2023-10-29 16:55:58 25 4
gpt4 key购买 nike

使用 arm-none-eabi-gcc对于 Cortex-M4(裸机应用程序),即使我从未在我的代码中使用 malloc,也会发出 malloc 的代码。

使用arm-none-eabi-objdump -xS obj.elf查看程序集输出,似乎malloc__register_exitproc调用了由 atexit 调用 由 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 b.w 4036bc <atexit>
4036b2: 4770 bx lr
4036b4: 00000000 .word 0x00000000
4036b8: 004036c9 .word 0x004036c9

但是,代码中从未调用过register_finimain() 使用以下启动代码调用,因此即使 main 退出,析构函数(或使用 atexit() 注册的函数)也不会被调用。

/**
* \brief This is the code that gets called on processor reset.
* To initialize the device, and call the main() routine.
*/
void Reset_Handler(void)
{
uint32_t *pSrc, *pDest;

/* Initialize the relocate segment */
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();

/* Clear the zero segment */
for (pDest = &_szero; pDest < &_ezero;) {
*pDest++ = 0;
}

/* Set the vector table base address */
pSrc = (uint32_t *) & _sfixed;
SCB->VTOR = ((uint32_t) pSrc);

/* Initialize the C library */
__libc_init_array();

/* Branch to main function */
main();

/* Infinite loop */
while (1);
}

代码使用 -ffunction-sections-fdata-sections 编译,并与标志 --gc-sections 链接,以便输出文件中不包含任何无法访问的代码/函数。


那么,我怎样才能防止我的代码中从未使用过的这些函数(register_finiatexitmalloc 等)被调用包含在目标文件中?


编译选项

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

链接选项

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

最佳答案

可能您需要编译器的 -fno-use-cxa-atexit 参数。

看这个简单的例子,在纯裸机上获得工作的 C++ 代码:https://github.com/cortexm/baremetal

关于c - 如何防止包含 C 库析构函数和 atexit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48711221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com