可执行文件在启动时显示 "line 1: ELF: not found"
Executable says "line 1: ELF: not found" when starts
我尝试为我的路由器 Xiaomi Router 3g
和 cmake
构建一个简单的 hello, world ELF
。它运行
Linux OpenWrt 4.14.95 #0 SMP Wed Jan 30 12:21:02 2019 mips GNU/Linux
我用the sdk for ramips platform (my router's platform).
想法是使用 $(PKG_BUILD_DIR)
作为执行外部构建的目录(通常通过 mkdir build ; cd build ; cmake ..
完成)
构建成功完成,当我将它安装到我的路由器上并启动它时,它失败了:
root@OpenWrt:~# chw
/usr/bin/chw: line 1: ELF: not found
/usr/bin/chw: line 2: syntax error: unexpected "("
当我构建没有 cmake
的 ELF
时(
- 注释掉行
include $(INCLUDE_DIR)/cmake.mk
,
- 取消注释
define Build/Prepare
部分中的 $(CP) ...
行
- 删除
define Build/Compile
部分
),它工作得很好:它打印 Hello, World!.
源代码可用 here
这里是源代码:
main.c
:
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
CMakeLists.txt
:
cmake_minimum_required (VERSION 2.6)
project (chw)
add_executable(chw main.c)
install(TARGETS chw DESTINATION /usr/bin)
Makefile
:
include $(TOPDIR)/rules.mk
PKG_NAME:=chw
PKG_VERSION:=0.1
PKG_RELEASE:=1
PKG_MAINTAINER:=John Doe <john.doe@example.com>
PKG_LICENSE:=CC0-1.0
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/chw
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Hello world application
URL:=https://www.example.com
endef
define Package/chw/description
hello world application
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
# $(CP) ./src/{main.c,Makefile} $(PKG_BUILD_DIR)/
endef
define Build/Configure
cmake -B $(PKG_BUILD_DIR) -S ./src
endef
define Build/Compile
$(call Build/Compile/Default,-C $(PKG_BUILD_DIR))
endef
define Package/chw/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/chw $(1)/usr/bin/
endef
$(eval $(call BuildPackage,chw))
显然您的目标系统不支持执行 ELF 文件,或者无法将您的文件识别为 ELF 文件。
在类UNIX系统上执行文件时,如果内核识别为可执行格式,则直接执行。如果不是,如果顶部没有 #!
行,它将尝试使用 /bin/sh
作为 shell 脚本执行它。它是一个二进制文件,但二进制文件和文本文件之间并没有真正明确的区别。
shell 显然试图将文件的开头(包括字符 ELF
)解释为命令,但无法在 $PATH
中找到该命令.
您需要找到一种方法来生成您的目标系统能够识别和接受的可执行文件。 (我不知道该怎么做。)
除了此处的其他答案外,"line 1: ELF: not found, line 2: syntax error: unexpected "(""
的可能原因很简单:
您是运行64 位 程序,在32 位 机器上运行。尝试更改您的编译配置。
您是否记得更改文件 属性 以使其可执行?
chmod +x filename
我知道我在下载某些东西(通常是安装二进制文件)时经常忘记这一步。
只是一个想法!
我尝试为我的路由器 Xiaomi Router 3g
和 cmake
构建一个简单的 hello, world ELF
。它运行
Linux OpenWrt 4.14.95 #0 SMP Wed Jan 30 12:21:02 2019 mips GNU/Linux
我用the sdk for ramips platform (my router's platform).
想法是使用 $(PKG_BUILD_DIR)
作为执行外部构建的目录(通常通过 mkdir build ; cd build ; cmake ..
完成)
构建成功完成,当我将它安装到我的路由器上并启动它时,它失败了:
root@OpenWrt:~# chw
/usr/bin/chw: line 1: ELF: not found
/usr/bin/chw: line 2: syntax error: unexpected "("
当我构建没有 cmake
的 ELF
时(
- 注释掉行
include $(INCLUDE_DIR)/cmake.mk
, - 取消注释
define Build/Prepare
部分中的$(CP) ...
行 - 删除
define Build/Compile
部分
),它工作得很好:它打印 Hello, World!.
源代码可用 here
这里是源代码:
main.c
:
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
CMakeLists.txt
:
cmake_minimum_required (VERSION 2.6)
project (chw)
add_executable(chw main.c)
install(TARGETS chw DESTINATION /usr/bin)
Makefile
:
include $(TOPDIR)/rules.mk
PKG_NAME:=chw
PKG_VERSION:=0.1
PKG_RELEASE:=1
PKG_MAINTAINER:=John Doe <john.doe@example.com>
PKG_LICENSE:=CC0-1.0
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/chw
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Hello world application
URL:=https://www.example.com
endef
define Package/chw/description
hello world application
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
# $(CP) ./src/{main.c,Makefile} $(PKG_BUILD_DIR)/
endef
define Build/Configure
cmake -B $(PKG_BUILD_DIR) -S ./src
endef
define Build/Compile
$(call Build/Compile/Default,-C $(PKG_BUILD_DIR))
endef
define Package/chw/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/chw $(1)/usr/bin/
endef
$(eval $(call BuildPackage,chw))
显然您的目标系统不支持执行 ELF 文件,或者无法将您的文件识别为 ELF 文件。
在类UNIX系统上执行文件时,如果内核识别为可执行格式,则直接执行。如果不是,如果顶部没有 #!
行,它将尝试使用 /bin/sh
作为 shell 脚本执行它。它是一个二进制文件,但二进制文件和文本文件之间并没有真正明确的区别。
shell 显然试图将文件的开头(包括字符 ELF
)解释为命令,但无法在 $PATH
中找到该命令.
您需要找到一种方法来生成您的目标系统能够识别和接受的可执行文件。 (我不知道该怎么做。)
除了此处的其他答案外,"line 1: ELF: not found, line 2: syntax error: unexpected "(""
的可能原因很简单:
您是运行64 位 程序,在32 位 机器上运行。尝试更改您的编译配置。
您是否记得更改文件 属性 以使其可执行?
chmod +x filename
我知道我在下载某些东西(通常是安装二进制文件)时经常忘记这一步。 只是一个想法!