【问题标题】:LPCXpresso error CreateProcess: No such file or directoryLPCXpresso 错误 CreateProcess:没有这样的文件或目录
【发布时间】:2015-04-18 05:56:40
【问题描述】:

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

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 得到了 name not found 的结果,但是有很多也取得了成功。

我也尝试过重新安装编译器和 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 通过防火墙 我已经尝试了更多的东西,我会在尝试复制测试后不久添加它。

【问题讨论】:

  • 听起来像是典型的“Eclipse 失控”问题... 一旦 Eclipse 失控,您可以花几天时间尝试修复它。我会从头开始创建一个新项目,并将所有代码放入新项目中。
  • @Lundin 尝试过这样做。我正在尝试编译一个示例程序。这是我第一次使用这个该死的程序。我的意思是,我只有一个空的主,我仍然得到它。它必须是编译器,但我对如何修复它没有任何想法。
  • 据我记得,您不需要手动设置路径或进行任何此类调整。我的计算机上有两个 LPCxpresso 实例,我的 PATH 系统变量中都没有提到。您要编译的代码是什么?恩智浦的示例之一还是其​​他?
  • 这可能与您计算机上的某些其他 GCC 编译器发生冲突。另外,check this.
  • 我唯一拥有的其他编译器是 SDCC,我从 PATH 中删除了它。它不是路径中的 LPCxpresso,而是编译器文件夹。

标签: c gcc cmd microcontroller toolchain


【解决方案1】:

看来你的问题是 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 重新编译arm-none-eabi-gcc.exe
  3. 补丁arm-none-eabi-gcc.exe

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

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

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搜索栏中,搜索一系列11909090909090...,90是汇编中的NOP) .这是为了找到一个代码洞穴(未使用的空间)来插入补丁,它有 11 个字节长。找到代码洞穴后,记下前 90 的偏移量。确切的偏移量在最底部显示为 Pos : xxxxxxxx。我将此偏移量称为 C。
  14. 使用编辑器更改1190的顺序:前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:搜索栏没有当它到达终点时不循环;手动到offset 0重新查找。
  17. 使用十六进制 32 位 2 补码计算器(例如: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,则必须将值 J(例如:FF 25 48 65 58 00)替换为 E9 AB 30 F9 FF。 J 的第 6 个字节可以保持不变。这 5 个字节是补丁的跳转。
  19. 文件 -> 保存

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

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

【讨论】:

  • 我真的很想自己尝试第三次,以防我再次遇到这样的问题。 2nd 是否意味着在编译时添加该行,例如arm...gcc led.c -D... 因为使用它我仍然得到消息。就像我现在一样,我很遗憾不得不使用 Vista,无法逃避(我也讨厌它)。
  • @s3v3ns 我添加了说明。关于第二个解决方案,不幸的是,这意味着下载所有 eabi gcc 源并重新编译。
  • 我对 18 号有点困惑。我应该把价值放在哪里? FF 25和90 90多的地方?
  • @s3v3ns 是的。有很多 FF 25 的地方是 DLL 跳转表,其中一个条目应该与 J 完全对应(例如:FF 25 48 65 58 00)。这是程序执行access 的地方。在这里,您将这 6 个字节(正常跳转)替换为跳转到补丁(E9 ...)。
  • 好吧,我不再遇到以前的错误了,这非常好,因为现在我有一个新错误要处理:D arm-none-eabi-gcc.exe : 错误: redlib.specs: 没有这样的文件或目录 我在使用 LPCxpresso 时得到了这个。当我通过 CMD(arm-...-gcc led.c) C:\Users\iamuser\Documents\LPCXpresso_7.6.2_326\workspace\led>arm-none-eabi 尝试时,我得到了另一个-gcc -led.c arm-none-eabi-gcc: 致命错误:-fuse-linker-plugin, but liblto_plugin-0.dll not found 编译终止。那个.dll在那里,我检查。但我想那是另一个话题?
猜你喜欢
  • 2011-12-19
  • 2014-05-09
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多