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

时间:2015-02-17 14:00:56

标签: c gcc cmd microcontroller toolchain

我知道关于这个问题存在多个问题,但它们没有帮助。 在尝试编译时,无论如何,我一直得到同样的错误:

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通过防火墙 我已经尝试了更多的东西,我会在尝试复制测试后立即添加它。

1 个答案:

答案 0 :(得分:2)

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

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

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

解决方案:

  1. 不要使用Vista
  2. 使用标记arm-none-eabi-gcc.exe
  3. 重新编译-D__USE_MINGW_ACCESS
  4. 补丁arm-none-eabi-gcc.exe
  5. 第三是最简单的,但它有点棘手。目标是劫持access函数并添加指令以防止意外行为。要修补你的gcc,你有两个解决方案:你上传你的.exe并为我修补它,或者我给你指示自己修补它。 (我也可以为你修补它,如果有效,则给出说明)。修补并不是很难,并且不需要高级知识,但你必须严谨。

    正如我所说,我自己没有遇到这个问题,所以我不知道我的解决方案是否真的有用。补丁似乎正在解决这个问题。< / p>

    <强> EDIT2:

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


    修改

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

    以下是修补说明:

    1. 备份您的arm-none-eabi-gcc.exe
    2. 下载并安装 CFF Explorer (直接链接here)。
    3. 使用CFF Explorer打开arm-none-eabi-gcc.exe
    4. 在左侧面板中,单击导入目录
    5. 在显示的模块列表中,单击 msvcrt.dll 行。
    6. 在显示的导入列表中,找到_access。这里要小心,列表很长,并且有多个_access条目。最后一个(我的最后一个条目)可能是好的。
    7. 当您点击_access行时,地址应显示在列表标题中,位于第二列第二行,就在 FTs(IAT)下方。记下记事本上的那个地址(对我来说,它是00180948,可能会有所不同)。我将此地址称为F。
    8. 在左侧面板中,单击地址转换器
    9. 应出现三个字段,在文件偏移字段中输入地址F.
    10. 在记事本上记下6个字节的值:前两个字节是FF 25,最后4个是VA字段中出现的地址,IN REVERSE。例如,如果00586548出现在VA字段中,请记下FF 25 48 65 58 00(为清晰起见添加空格)。我将此值称为J.此值J是跳转到_access函数的指令。
    11. 在左侧面板中,单击 Section Headers
    12. 在右侧显示的部分列表中,单击 .text 行(.text部分是代码所在的部分)。
    13. 在下面显示的编辑器面板中,点击放大镜,然后在 Hex 搜索栏中搜索一系列11 909090909090...,90是NOP在组装中)。这是为了找到一个代码洞(未使用的空间)来插入补丁,这个长度是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. 点击下面的箭头图标( Go To Offset ),输入0,导航到文件的开头。
    16. 再次使用十六进制搜索栏搜索值J.如果找到刚修改的字节,请跳过。您需要的J值位于包含FF 25和90 90的许多值附近。这就是DLL跳转表。记下找到的值J的偏移量(第一个字节的偏移量,FF)。我将此偏移称为S.注1:如果找不到该值,可能在步骤6中选择了错误的_access,或者在步骤6到10之间出错了。注2:搜索栏在结束时不会循环播放;手动转到0以重新找到。
    17. 使用十六进制32位二进制补码计算器(如下所示:calc.penjee.com)计算C - S - 5.如果偏移量C为8C0且偏移量S为6D810,则必须获得FF F9 30 AB(8C0减去6D810,减去5)。
    18. 将文件中找到的值J(步骤16)替换为5个字节:第一个字节为E9,最后4个为最后一个操作的结果,IN REVERSE。如果获得FF F9 30 AB,则必须用E9 AB 30 F9 FF替换值J(例如:FF 25 48 65 58 00)。 J的第6个字节可以不受影响。这5个字节是跳转到补丁。
    19. 文件 - &gt;保存
    20. 注意:您应该修改了总共16个字节。如果补丁程序崩溃,你做错了什么。即使它不起作用,这个补丁也不会导致崩溃。

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