c-LPCXpresso错误CreateProcess:没有这样的文件或目录



我知道关于这个主题有很多问题,但它们没有帮助。当试图编译时,不管怎样,我总是得到同样的错误:

arm-none-eabi-gcc.exe: error: CreateProcess: No such file or directory

我想这意味着它找不到编译器。我已经尝试调整路径设置

C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:nxpLPCXpresso_7.6.2
326lpcxpressotoolsbin;

似乎是对的?

我尝试过使用Sysinternals进程监视器我可以看到很多arm none-eabi-gcc.exe都得到了未找到名称的结果,但也有很多成功的结果。

我也试过重新安装编译器和LPCXpresso,但运气不好。

如果我键入arm-none-eabi-gcc -v,我会得到版本,所以这意味着它正在工作但是当我尝试像arm-none-eabi-gcc led.c这样在CMD中编译时我得到了与上面相同的错误

arm-none-eabi-gcc.exe: error: CreateProcess: No such file or directory

尝试在环境中更多地使用PATH,但没有成功。我觉得有什么东西阻止了LPCXpresso找到编译器这台电脑唯一的防病毒软件是Avira,我禁用了它。我还允许编译器和LPCXpresso通过防火墙我已经尝试了更多的东西,我会在尝试重复测试后不久添加它。

您的问题似乎是Vista和GCC一团糟。长话短说,CRT函数access在Windows和Linux上有不同的行为。微软文档中确实提到了这种差异,但GCC人员没有注意到。这导致了Vista上的一个错误,因为这个版本的Windows在这一点上更严格。

这里提到了这个bug:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=33281

我没有证据表明你的问题来自这里,但机会很大。

解决方案:

  1. 不要使用Vista
  2. 使用标志-D__USE_MINGW_ACCESS重新编译arm-none-eabi-gcc.exe
  3. 补丁arm-none-eabi-gcc.exe

第三个是最简单的,但有点棘手。目标是劫持access函数,并添加一条指令来防止不期望的行为。要修补你的gcc,你有两个解决方案:你上传你的.exe,我帮你修补它,或者我给你自己修补它的说明。(我也可以帮你打补丁,如果有效的话,请给出说明)。打补丁并不难,也不需要高级知识,但你必须严格。

正如我所说,我自己没有这个问题,所以我不知道我的解决方案是否真的有效修补程序似乎能解决这个问题。

第2版:

确切的问题是,linuxaccess有一个参数标志来检查文件是否可执行。Windowsaccess无法对此进行检查。大多数Windows版本的行为只是忽略此标志,并检查文件是否存在,这通常会给出相同的行为。问题是Vista并没有忽略这一点,每当使用access检查可执行性时,它都会返回一个错误。这导致GCC程序认为有些可执行文件不在这里。-D__USE_MINGW_ACCESS引发的补丁,或者手动完成的补丁,是在调用access时删除标志,从而像其他Windows版本一样检查是否存在。


编辑:

实际上,每个调用其他可执行文件的GCC程序都需要打补丁,而不仅仅是gcc.exe。到目前为止,只有gcc.execollect2.exe

以下是修补说明:

  1. 备份您的arm-none-eabi-gcc.exe
  2. 下载并安装CFF资源管理器(此处直接链接)
  3. 使用CFF资源管理器打开arm-none-eabi-gcc.exe
  4. 在左侧面板上,单击导入目录
  5. 在出现的模块列表中,单击msvcrt.dll
  6. 在出现的导入列表中,找到_access。这里要小心,列表很长,并且有多个_access条目。最后一个(对我来说是最后一个条目)可能是好的一个
  7. 单击_access行时,地址应出现在列表标题的第2列第2行,就在FT(IAT)下方。把那个地址写在记事本上(对我来说,是00180948,可能不同)。我将这个地址称为F
  8. 在左侧面板上,单击地址转换器
  9. 应显示三个字段,在文件偏移字段中输入地址F
  10. 在记事本上写下一个6字节的值:前两个字节是FF 25,后4个是出现在VA字段中的地址,反向。例如,如果VA字段中出现00586548,则记下FF 25 48 65 58 00(为易读性添加空格)。我将把这个值称为J。这个值J是跳转到_access函数的指令
  11. 在左侧面板上,单击Section Headers
  12. 在右侧出现的部分列表中,单击.text行(.text部分是代码所在的位置)
  13. 在下面出现的编辑器面板中,单击放大镜,然后在Hex搜索栏中搜索一系列11个90(9090909090...,90是程序集中的NOP)。这是为了找到一个代码洞穴(未使用的空间)来插入11字节长的补丁。一旦你找到一个代码洞,记下前90的偏移量。确切的偏移量显示在最底部,显示为位置:xxxxxxxx。我将把这个偏移量称为C
  14. 使用编辑器更改1190的顺序:前5个字节为80 64 E4 08 06。这5个字节是防止错误行为的指令。最后6个字节是值J(将接下来的6个字节编辑为J,例如FF 25 48 65 58 00),以跳回到_access函数
  15. 单击下面的箭头图标(转到偏移),然后输入0,导航到文件的开头
  16. 再次使用十六进制搜索栏来搜索值J。如果找到刚修改的字节,请跳过。您需要的J值位于包含FF 25和90 90的许多值周围。这就是DLL跳转表。记下您找到的值J的偏移量(第一个字节的偏移量FF)。我将把这个偏移称为S。注意1:如果找不到值,可能是您在步骤6中选择了错误的_access,或者在步骤6到10之间做了错误的事情。注2:搜索栏在到达末尾时不会循环;手动转到偏移量0以重新查找
  17. 使用一个十六进制32位2补全计算器(类似于calc.penjee.com)来计算C-S-5。如果偏移量C为8C0,偏移量S为6D810,则必须获得FF F9 30 AB(8C0减去6D810,减去5)
  18. 用5个字节替换您在文件(步骤16)中找到的值J:第一个字节是E9,最后4个字节是最后一次操作的结果,in REVERSE。如果您获得FF F9 30 AB,则必须将值J(例如:FF 25 48 65 58 00)替换为E9 AB 30 F9 FF。J的第6个字节可以保持不变。这5个字节是到补丁的跳转
  19. 文件->保存

注意:您应该总共修改了16个字节。如果修补程序崩溃,说明您做错了什么。即使它不起作用,这个补丁也不会引发崩溃。

如果你在某个地方有困难,请告诉我。

相关内容

最新更新