Reilly
Reilly

注册于 10 months ago

回答
0
文章
0
关注者
0

armink 发表于 2019-12-25 21:46
你用的哪个发行版,争取 v1.2 版本支持 linux 哈


v1.2 啥时候发布哈

自己领了钱吧。
问题解决了:
1. 在M_LFLAGS中去掉 -nostdlib,然后编译模块即可。模块大小大概会增加50%左右。
然后在linux下用命令行查看:
readelf -s xxx
会发现原来的___aeabi_ 消失了,因为函数编译到了模块里卖弄,而不是引用外面的。
2.解决math函数问题:首先extern一下,然后RTM_EXPORT()即可。
例如:
extern double atof(const char *str);
RTM_EXPORT(atof);

我自己查看了linux的内核,发现存在会变得导出符号:
# cat /proc/kallsyms | grep "eabi"

c02d8238 T __aeabi_llsl
c02d8254 T __aeabi_lasr
c02da0e0 T __aeabi_uidiv
c02da21c T __aeabi_idiv
c02da3a0 T __aeabi_uidivmod
c02da3b8 T __aeabi_idivmod
c02da3e0 T __aeabi_llsr
c02dac00 T __aeabi_lmul
c02dae38 T __aeabi_ulcmp
c0872018 R __ksymtab___aeabi_idiv
c0872020 R __ksymtab___aeabi_idivmod
c0872028 R __ksymtab___aeabi_lasr
c0872030 R __ksymtab___aeabi_llsl
c0872038 R __ksymtab___aeabi_llsr
c0872040 R __ksymtab___aeabi_lmul
c0872048 R __ksymtab___aeabi_uidiv
c0872050 R __ksymtab___aeabi_uidivmod
c0872058 R __ksymtab___aeabi_ulcmp
c0881548 r __kcrctab___aeabi_idiv
c088154c r __kcrctab___aeabi_idivmod
c0881550 r __kcrctab___aeabi_lasr
c0881554 r __kcrctab___aeabi_llsl
c0881558 r __kcrctab___aeabi_llsr
c088155c r __kcrctab___aeabi_lmul
c0881560 r __kcrctab___aeabi_uidiv
c0881564 r __kcrctab___aeabi_uidivmod
c0881568 r __kcrctab___aeabi_ulcmp
c0889264 r __kstrtab___aeabi_ulcmp
c0889272 r __kstrtab___aeabi_uidivmod
c0889283 r __kstrtab___aeabi_uidiv
c0889291 r __kstrtab___aeabi_lmul
c088929e r __kstrtab___aeabi_llsr
c08892ab r __kstrtab___aeabi_llsl
c08892b8 r __kstrtab___aeabi_lasr
c08892c5 r __kstrtab___aeabi_idivmod
c08892d5 r __kstrtab___aeabi_idiv,

然后查看了RTT的符号表,发现没有类似的__eabi_xxx,所以问题就在于怎么导出汇编符号了:
rt_thread_yield => 0x080346f9
rt_thread_delay => 0x08034795
rt_thread_mdelay => 0x080347ad
rt_thread_control => 0x080347cd
rt_thread_suspend => 0x080348a1
rt_thread_resume => 0x0803496d
rt_thread_timeout => 0x08034a05
rt_thread_find => 0x08034a89
rt_timer_init => 0x08034c61
rt_timer_detach => 0x08034ca9

eddylin 发表于 2019-9-23 17:15
我现在就在用stm32cubeide,而且我也加过支持了,你可以试试--target=eclipse。反正我自己用是没问题了。 ...


我也加了一些,当时没去自习研究。eclipse和cubeide的工程文件存在一些区别,需要改改eclipse.py文件,希望官方做的更好。

请问下面这种符号怎么连接进去:
#define __negdf2 __aeabi_dneg
#define __subdf3 __aeabi_dsub
#define __adddf3 __aeabi_dadd
#define __floatunsidf __aeabi_ui2d
#define __floatsidf __aeabi_i2d
#define __extendsfdf2 __aeabi_f2d
#define __truncdfsf2 __aeabi_d2f
#define __floatundidf __aeabi_ul2d
#define __floatdidf __aeabi_l2d
#define __muldf3 __aeabi_dmul
#define __divdf3 __aeabi_ddiv
#define __unorddf2 __aeabi_dcmpun
#define __fixdfsi __aeabi_d2iz
#define __fixunsdfsi __aeabi_d2uiz
#define __fixdfdi __aeabi_d2lz
#define __fixunsdfdi __aeabi_d2ulz
#define __floatdidf __aeabi_l2d
#define __extendhfsf2 __gnu_h2f_ieee
#define __truncsfhf2 __gnu_f2h_ieee

结贴:
目前应该没有什么好的解决办法,先用其他办法绕过去:
需要需要用到的强制转换,如整形乘以浮点转整形等等这些汇编的运算只能在固件中先声明,然后输出函数,模块加载的时候调用输出的函数,这样就规避了汇编无法导出的问题。
这个希望后面RTT改进,LINUX应该是在系统加载的时候会加载很多常用的汇编符号。

bernard 发表于 2019-9-17 10:17
例如这个缺少,
01-01 00:00:00.472 E/DLMD main: Module: can't find __aeabi_dmul in kernel symbol tabl ...


所以简单的用RTM_EXP无法导出,找不到相关定义。

bernard 发表于 2019-9-17 10:17
例如这个缺少,
01-01 00:00:00.472 E/DLMD main: Module: can't find __aeabi_dmul in kernel symbol tabl ...


我看了GCC源码,这个是在libgcc库里面,然后这个库编译的时候又是个静态库,我在猜编译器遇到这种浮点型转整形的隐形转换就需要调用libgcc里面的汇编。
我看了下__aeabi_d2f实际是__floatsidf 这个函数,定义如下:
DFtype
__floatsidf (SItype i)
{
FP_DECL_D (A);
DFtype a;

FP_FROM_INT_D (A, i, SI_BITS, USItype);
FP_PACK_RAW_D (a, A);

return a;
}

所以应该要把libgcc抠出来单独编译到RTT,有点复杂啦。

下面是我grep搜到的:

./gcc/ChangeLog-2005:7035: * config/m68k/fpgnuib.c (__floatsidf): Don't rely on signed overflow.
./gcc/config/msp430/msp430.c:2126: { "__floatsidf", "__mspabi_fltlid" },
./gcc/doc/gccint.info:559: -- Runtime Function: double __floatsidf (int I)
Binary file ./gcc/doc/gccint.info matches
./gcc/doc/libgcc.texi:346:@deftypefnx {Runtime Function} double __floatsidf (int @var{i})
./libgcc/config/arc/dp-hack.h:72:#define __floatsidf __floatsidf_c
./libgcc/config/arc/ieee-754/floatsidf.S:29: .global __floatsidf
./libgcc/config/arc/ieee-754/floatsidf.S:31: FUNC(__floatsidf)
./libgcc/config/arc/ieee-754/floatsidf.S:32:__floatsidf:
./libgcc/config/arc/ieee-754/floatsidf.S:34: bl.d __floatsidf_c
./libgcc/config/arc/ieee-754/floatsidf.S:39: bl.d __floatsidf_asm
./libgcc/config/arc/ieee-754/floatsidf.S:48: ENDFUNC(__floatsidf)
./libgcc/config/arc/ieee-754/floatsidf.S:49:#define __floatsidf __floatsidf_asm
./libgcc/config/arc/ieee-754/floatsidf.S:52: .global __floatsidf
./libgcc/config/arc/ieee-754/floatsidf.S:54: FUNC(__floatsidf)
./libgcc/config/arc/ieee-754/floatsidf.S:55:__floatsidf:
./libgcc/config/arc/ieee-754/floatsidf.S:77: ENDFUNC(__floatsidf)
./libgcc/config/arm/sfp-machine.h:94:#define __floatsidf __aeabi_i2d
./libgcc/config/bfin/libgcc-glibc.ver:58: ___floatsidf
./libgcc/config/c6x/sfp-machine.h:93:#define __floatsidf __c6xabi_fltid
./libgcc/config/frv/frv-abi.h:102:#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY(__floatsidf,__itod)
./libgcc/config/m68k/fpgnulib.c:173:__floatsidf (long a1)
./libgcc/config/m68k/fpgnulib.c:229: double foo = __floatsidf (l);
./libgcc/config/m68k/fpgnulib.c:392:double __floatsidf (long);
./libgcc/config/m68k/fpgnulib.c:500: double foo = __floatsidf (l);
./libgcc/config/msp430/floathidf.c:2:extern double __floatsidf (long);
./libgcc/config/msp430/floathidf.c:7: return __floatsidf ((long)u);
./libgcc/config/nds32/lib1asmsrc-mculib.S:4301: .global __floatsidf
./libgcc/config/nds32/lib1asmsrc-mculib.S:4302: .type __floatsidf, @function
./libgcc/config/nds32/lib1asmsrc-mculib.S:4303:__floatsidf:
./libgcc/config/nds32/lib1asmsrc-mculib.S:4364: .size __floatsidf, .-__floatsidf
./libgcc/config/xtensa/ieee754-df.S:2072: .global __floatsidf
./libgcc/config/xtensa/ieee754-df.S:2073: .type __floatsidf, @function
./libgcc/config/xtensa/ieee754-df.S:2074:__floatsidf:
./libgcc/fp-bit.h:282:# define si_to_float __floatsidf
./libgcc/libgcc-std.ver.in:58: __PFX__floatsidf
./libgcc/soft-fp/floatsidf.c:36:__floatsidf (SItype i)

bernard 发表于 2019-9-17 07:51
有什么问题,论坛讨论好了。直接微信,QQ,邮件沟通,这个就会涉及到私下沟通,支持的事情了 ...


那能不能说个具体的导出步骤,也方便其他的使用者参考,我搞完了再整理下发到这里。

bernard 发表于 2019-9-16 18:55
需要用到哪些API,就导出哪些


方便加个微信请教下吗?

Reilly 发表于 2019-9-16 17:57
意思是我下载噶gcc源码 然后从里面扣出libGCC函数,复制到源码下再导出?


有没有方法如何导?

我看了下GCC源码,涉及的东西蛮多,估计不得行。

bernard 发表于 2019-9-16 16:30
这个是需要自行一个个导出的。这个在libc层面,确实比较繁琐


意思是我下载噶gcc源码 然后从里面扣出libGCC函数,复制到源码下再导出?

wuhanstudio 发表于 2019-9-16 15:05
可以看看 Keil ARM 的文档:

http://www.keil.com/support/man/docs/armlib/armlib_chr1358938941848.htm ...


这个是Keil ARMCC编译器的,我用的是GCC。
不使用动态库,浮点型转整形是可以正确运行。
放在动态库里面的话,因为库加载的时候需要链接一些函数符号,如__aeabi_d2f,而这些符号RTT本身没有export,所以不能正确解析记载。

发布
问题

分享
好友