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
catl'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
sdkconstruitELFpour mon système hôte et pas pour mon routeur. J'ai besoin de savoir comment utilisercmakepour construireELFpour mon routeur. N'hésitez pas à laisser votre commentaire comme réponse, je l'accepterai.