明天解决了一个问题,就是:collect2.exe: fatal error: CreateProcess: No such file or directory。
其实实质上就是:在Windows上,传递给CreateProcess()的字符串(包含所有参数)的最大长度为32768个字符,看起来最终的链接器命令超过了这个限度。
咱们当初看看链接参数:
aarch64-none-elf-gcc -o oneos.elf -mcpu=cortex-a55 -Lexternal -nostartfiles -Wl,--gc-sections,-Map=oneos.map,-cref,-u,_start -z max-page-size=4096 -T board/linker_scripts/link.lds @.link_param.tmp -LD:\xiaoneng\oneos-qiyun\drivers\link -lc -lm
这么一看总的字符串长度,挺短的不是?其实不是这样的,因为有大量的须要链接的*.o
文件门路存在于link_param.tmp
。因而,咱们计算字符串长度的时候须要把它给开展,这一下就大了哟!!!很容易就超出了32767个字符!!!
晓得起因了,解决起来就有方向了,有以下方向:
- 躲避:让字符不要超过最大长度,把太多的.o文件间接归类为.a的库
- 全副代替:间接替换工具链,让它反对更大长度
- 局部代替:应用反对超出最大长度为32767个字符,这里能够间接代替
collect2.exe
这里改的形式就是应用了第三种计划,简略高效。
当然,还有各种有意思的改发,比方让代码的目录放在盘符根目录,其实也是躲避的一种,因为这样无效减小了*.o
的门路,变相的减小了传递给CreateProcess()的字符串,也算是曲线救国了。。。