J'essaie de créer un simple bonjour, monde ELF
pour mon routeur Xiaomi Router 3g
avec cmake
. Il exécute
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))
J'utilise la plateforme sdk pour ramips (plateforme de mon routeur) .
L'idée est d'utiliser $ (PKG_BUILD_DIR) en tant que répertoire pour effectuer une construction externe (ce qui se fait généralement via
mkdir build; cd build; cmake ..
)
La construction se termine avec succès et quand je l'installe sur mon routeur et le démarrer, il échoue avec:
cmake_minimum_required (VERSION 2.6) project (chw) add_executable(chw main.c) install(TARGETS chw DESTINATION /usr/bin)
Quand je construis le ELF
sans cmake
( p>
include $ (INCLUDE_DIR) /cmake.mk
, $ (CP) ...
dans la section define Build / Prepare
define Build / Compile
), cela fonctionne très bien: il affiche Bonjour le monde! .
Le fichier journal est ici ,
Le fichier .config
se trouve ici
Le code source est disponible ici
Voici le code source:
main.c
:
#include <stdio.h> int main() { printf("Hello, World!"); return 0; }
CMakeLists.txt
:
root@OpenWrt:~# chw /usr/bin/chw: line 1: ELF: not found /usr/bin/chw: line 2: syntax error: unexpected "("
Makefile
:
Linux OpenWrt 4.14.95 #0 SMP Wed Jan 30 12:21:02 2019 mips GNU/Linux
3 Réponses :
Apparemment, votre système cible ne prend pas en charge l'exécution des fichiers ELF ou ne reconnaît pas votre fichier comme un fichier ELF.
Lorsque vous exécutez un fichier sur un système de type UNIX, il sera exécuté directement si le noyau le reconnaît comme un format exécutable. Sinon, s'il n'y a pas de ligne #!
en haut, il essaiera de l'exécuter en tant que script shell en utilisant / bin / sh
. C'est un fichier binaire, mais il n'y a pas de distinction vraiment ferme entre les fichiers binaires et texte.
Le shell a apparemment essayé d'interpréter le début du fichier (qui comprend les caractères ELF
) comme une commande, et n'a pas pu trouver cette commande dans $ PATH code >.
Vous devrez trouver un moyen de générer un fichier exécutable que votre système cible reconnaîtra et acceptera. (Je ne sais pas comment faire ça.)
En plus d'autres réponses ici, il peut y avoir une cause simple pour "ligne 1: ELF: introuvable, ligne 2: erreur de syntaxe: inattendue" (""
:
Vous exécutez un programme 64 bits sur un ordinateur 32 bits . Essayez de changer votre configuration de compilation.
Vous êtes-vous souvenu de changer la propriété du fichier pour le rendre exécutable?
chmod +x filename
Je sais que j'oublie souvent cette étape lorsque je télécharge quelque chose (généralement un binaire d'installation). Juste une pensée!
L'erreur suggère que votre binaire ELF est exécuté en tant que script shell. Cependant, je ne vois pas immédiatement pourquoi.
@Nate Eldredge Ouais, c'est bizarre, j'y ai pensé et j'ai essayé de
cat
l'ELF, mais cela semblait être un fichier binaire.Oui, je m'attendrais à ce qu'un fichier ELF soit binaire. Si un système d'exploitation de type UNIX ne sait pas comment exécuter un fichier ELF directement, ou ne reconnaît pas votre fichier comme ELF, il essaiera de le transmettre à
/ bin / sh
. Le shell ne rejette pas nécessairement les fichiers binaires, mais il est susceptible de s'étouffer à cause d'une mauvaise syntaxe. Que vous ditfile chw
? (Exécutez cette commande sur votre système hôte si la cible n'a pas de commandefile
.)@KeithThompson, merci pour votre commentaire, j'ai essayé d'exécuter l'application sur mon ordinateur hôte et cela fonctionne, apparemment le
sdk
construitELF
pour mon système hôte et pas pour mon routeur. J'ai besoin de savoir comment utilisercmake
pour construireELF
pour mon routeur. N'hésitez pas à laisser votre commentaire comme réponse, je l'accepterai.