1
votes

L'exécutable dit "ligne 1: ELF: introuvable" au démarrage

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>

  1. commentez la ligne include $ (INCLUDE_DIR) /cmake.mk ,
  2. décommentez la ligne $ (CP) ... dans la section define Build / Prepare
  3. éliminer la section 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


4 commentaires

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 dit file chw ? (Exécutez cette commande sur votre système hôte si la cible n'a pas de commande file .)


@KeithThompson, merci pour votre commentaire, j'ai essayé d'exécuter l'application sur mon ordinateur hôte et cela fonctionne, apparemment le sdk construit ELF pour mon système hôte et pas pour mon routeur. J'ai besoin de savoir comment utiliser cmake pour construire ELF pour mon routeur. N'hésitez pas à laisser votre commentaire comme réponse, je l'accepterai.


3 Réponses :


5
votes

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 .

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.)


0 commentaires

3
votes

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.


0 commentaires

2
votes

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!


0 commentaires