• 基于cygwin构建u-boot(四)libgcc引用


    接上文,config.mk文件修改后,即使没有.depend也可以正常处理了:

    六、错误:gcclib引用错误

    完成之前几篇的工作后,程序就可以一直执行了,直到最后生成u-boot

    出现如下错误告警如下

    1 d:/cygwin/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3libgcc.a(_dvmd_lnx.o): 
    In function `__aeabi_ldiv0':(.text+0x8): undefined reference to `raise' 2 Makefile:359: recipe for target `u-boot' failed 3 make: *** [u-boot] Error 1

    从字面上立即理解,是__aeabi_ldiv0函数需要 raise函数,但没有找到定义。

    1、初步分析:参考其他资料,发现和libgcc库有一定关系。

    从路径上看,是工具链的libgcc.a调用__aeabi_ldiv0函数

    其他途径了解,需要自己构建raise函数。要么是重新编译库,要么是在u-boot底层修改。

    感觉这是u-boot通用性问题,u-boot应该有特殊应对的。

    2、经过搜索,发现u-boot代码中有raise函数

    u-boot-2010.09archarmlibeabi_compat.c文件中,有raise函数的定义。

    1 int raise (int signum)
    2 {
    3     printf("raise: Signal # %d caught
    ", signum);
    4     return 0;
    5 }

    但是编译过程没有进行该编译文件。

    打开该文件夹下的makefile文件。

    1 # For EABI conformant tool chains, provide eabi_compat()
    2 ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS)))
    3 TARGETS    += $(obj)eabi_compat.o
    4 endif

    需要将ARM -mabi设定为 aapcs-linux才会编译该文件。

    3、-mabi=aapcs-linux后,还是无法正常处理。

    由于makefile只是编译了文件,没有加入库,也没有外部引用。配置后仍然无法使用。

    【注】由于暂时不想通过修改u-boot原始代码实现,所以再找找其他途径。

    4、发现 archarmlibmakefile还有其他功能。

    1 # Always build libarm.a
    2 TARGETS    := $(LIB)
    3 
    4 # Build private libgcc only when asked for
    5 ifdef USE_PRIVATE_LIBGCC
    6 TARGETS    += $(LIBGCC)
    7 endif

    看到了可以通过USE_PRIVATE_LIBGCC,构建私有的libgcc。

    【注释】arm-linux的工具链一般都带libgcc库。

    再回到主文件夹的Makefile,找到如下代码:

     1 # Add GCC lib
     2 ifdef USE_PRIVATE_LIBGCC
     3 ifeq ("$(USE_PRIVATE_LIBGCC)", "yes")
     4 PLATFORM_LIBGCC = -L $(OBJTREE)/arch/$(ARCH)/lib -lgcc
     5 else
     6 PLATFORM_LIBGCC = -L $(USE_PRIVATE_LIBGCC) -lgcc
     7 endif
     8 else
     9 PLATFORM_LIBGCC = -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
    10 endif
    11 PLATFORM_LIBS += $(PLATFORM_LIBGCC)
    12 export PLATFORM_LIBS

    可以看到libgcc可以从三个途径配置:

    1)USE_PRIVATE_LIBGCC = yes,从 /arch/arm/lib 中获得 libgcc.a

    2)USE_PRIVATE_LIBGCC = path+file,从 指定的路径获得 libgcc.a

    3)如果没有配置USE_PRIVATE_LIBGCC,就从工具链 libgcc路径获得。

        该方式是通过gcc工具返回的,见下shell命令

    1 $ ./arm-2009q1/bin/arm-none-linux-gnueabi-gcc -print-libgcc-file-name
    2 d:/cygwin/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc.a

    5、完成u-boot输出,在make是,添加 USE_PRIVATE_LIBGCC = yes参数,编译后,就产生u-boot了。

     

     ===【完成构建】=== 

  • 相关阅读:
    sublime如何自动保存
    什么是DQL、DML、DDL、DCL
    Linux Shall命令入门
    省市区地址三级联动jQuery插件Distpicker使用
    ThinkPHP3.2设置404跳转页面
    File.separator
    HiddenHttpMethodFilter
    SpringMVC环境搭建
    JVM介绍(一)
    some characters cannot be mapped using iso-8859-1 character encoding
  • 原文地址:https://www.cnblogs.com/yvivid/p/3575424.html
Copyright © 2020-2023  润新知