__attribute((constructor)) 在执行程序里失效,没有被调用,手动调用...

利用 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))  的函数.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容