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

LPCXpresso error CreateProcess: No such file or directory

我知道有很多关于这个主题的问题,但他们没有帮助。 尝试编译时,无论如何,我总是收到同样的错误:

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

我猜这意味着它找不到编译器。 我试过调整路径设置

C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\nxp\LPCXpresso_7.6.2
326\lpcxpresso\tools\bin;

好像是对的?

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

我也试过重新安装编译器和 LPCXpresso,但没有成功。

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

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

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

看来你的问题是 Vista 和 GCC 的问题。长话短说,CRT 函数 access 在 Windows 和 Linux 上有不同的行为。 Microsoft 文档中实际上提到了这种差异,但 GCC 人员没有注意到。这导致了 Vista 上的错误,因为此版本的 Windows 在这一点上更加严格。

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

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

解决方案:

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

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

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

编辑2:

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


编辑:

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

补丁说明如下:

  1. 备份你的 arm-none-eabi-gcc.exe.
  2. 下载并安装CFF Explorer(直接linkhere)。
  3. 使用 CFF 资源管理器打开 arm-none-eabi-gcc.exe
  4. 在左侧面板上,单击导入目录
  5. 在出现的模块列表中,单击 msvcrt.dll 行。
  6. 在出现的导入列表中,找到_access。这里要小心,列表很长,并且有多个 _access 条目。最后一个(对我来说是最后一个条目)可能是好的。
  7. 当您单击 _access 行时,地址应出现在列表 header 的第 2 列第 2 行中,就在 FTs(IAT)[= 下面110=]。在记事本上记下该地址(对我来说,它是 00180948,可能不同)。我将此地址称为 F.
  8. 在左侧面板上,单击 地址转换器
  9. 应出现三个字段,在 文件偏移量 字段中输入地址 F。
  10. 在记事本上写下一个6字节的值:前两个字节是FF 25,后4个是VA字段中出现的地址,IN REVERSE。例如,如果 VA 字段中出现 00586548,则记下 FF 25 48 65 58 00(为便于阅读添加 spaces)。我将这个值称为 J。这个值 J 是跳转到 _access 函数的指令。
  11. 在左侧面板上,单击 部分 Headers
  12. 在右侧出现的部分列表中,单击 .text 行(.text 部分是代码所在的位置)。
  13. 在下面出现的编辑器面板中,单击放大镜,然后在 Hex 搜索栏中搜索一系列 11 90 (9090909090..., 90 在汇编中是 NOP)。这个是找个code cave(未用space)插入补丁,11个字节长。找到代码洞后,记下前 90 个的偏移量。确切的偏移量显示在最底部,如 Pos : xxxxxxxx。我将此偏移量称为 C.
  14. 使用编辑器改变11的顺序90:前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跳转table。记下您找到的值 J 的偏移量(第一个字节的偏移量,FF)。我将此偏移量称为 S.Nte 1:如果找不到值,可能是您在第 6 步中选择了错误的 _access,或者在第 6 步到第 10 步之间做错了什么。注意 2:搜索栏在点击时不会循环结尾;手动转到偏移量 0 到 re-find.
  17. 使用一个16进制的32位2补码计算器(像这个:calc.penjee.com)来计算C - S - 5。如果你的偏移量C是8C0,你的偏移量S是6D810,你必须得到FF F9 30 AB (8C0 负 6D810, 负 5).
  18. 用5个字节替换你在文件中找到的值J(在第16步):第一个字节是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 个字节。如果打过补丁的程序崩溃了,那说明你做错了什么。即使不起作用,此补丁也不会导致崩溃。

如果您在某处遇到困难,请告诉我。