利用 gcc 提供的 __attribute((constructor)) 可以在 main() 之前就可做一些初始化的工作, 但是在嵌入式上用却出了点问题.
用 __attribute((constructor)) 定义的函数在动态库是可以被程序正常调用的, 但是放在main() 一起编译就没被调用, 在host PC上同样的程序却可以被正常的调用
__attribute((constructor)) void test()
{
printf("__attribute((constructor)) \n");
}
int main()
{
printf("main()\n");
}
在上面的例子中, 在 目标板子上编译出来跑起, test()没有被执行, 但是 pc是可以的. 太奇怪了,动态库却没有这样的问题.
查看 汇编test也被编译进.o了,编译成可执行文件 .init_array 也是存在的, 但是就是没有被调用. 对比目标板子编出来和pc端的执行文件的elf布局,发现还是有些区别, 在pc端的有__init_array_start 和 __init_array_end 这两个符号, 但目标板子 却没有.
当在目标板子手动调用__init_array_start 后, 没有报错, 重新查看elf, 出现了 __init_array_start ,但是没有 __init_array_end. 说明gcc对这个还是有处理的, 时间关系最后手动调用 通过 __init_array_start 和 __init_array_end 来执行init_array段的 __attribute((constructor)) 的函数.