ターゲットファイルの実行に起因する問題:syntax error:word unexpected(expe...

3891 ワード

今日、ターゲットファイルを実行可能ファイルとして開発ボードに誤って配置して実行した結果、./hello_qt:line 1:syntax error:word unexpected(expecting"))、これまでこのことに遭遇したことがないので、少しぼんやりしていますが、簡単なhello worldで問題はありません.そこでgoogleは、もともと小さな-cコンパイルオプションが幽霊だった.***
armとpcで実行するターゲットファイルの違い
一般的に、gcc-cオプションでコンパイルされたターゲットファイルは実行できないため、特にPCではこのような問題に遭遇することはありません.こちらはwindowsワークベンチにファイルを転送し、tftpでダウンロードした開発ボードにファイルがすべて普通のファイルで、自分でchmod+xを変更して実行できるので、油断してやっとこの問題にぶつかった.
  • PCでターゲットファイルを実行するエラーメッセージ
  • ~/test$ ./zh_display.o
    -bash: ./zh_display.o: cannot execute binary file
  • ARMでクロスコンパイル対象ファイルを実行するエラーメッセージ
  • $ ./hello_qt 
    ./hello_qt: line 1: syntax error: word unexpected (expecting ")")
    PCのヒント情報は一目でわかりますが、ARMのヒントは不思議です.最初は自分のコードに問題があるのではないかと疑って、繰り返しチェックしましたが、幸いにも簡単なhello worldプログラムで、さもなくば私は憂鬱です.私がタイムリーにgoogleのおかげで、さもなくばまたどのくらいの时間を浪費してこの小さい問題の上で知らないで、时にはgoogleは本当にとても重要です!!
    ターゲットファイルと実行可能ファイルの区別
    ターゲットファイルと実行可能ファイルは普段から区別しやすいので、一般的には注意しません.しかし、今日の問題から、私はまた両者の違いについて多くのことを学びました.そして、両者を区別するLinuxツールも学びました.
  • fileツール:ファイルの基本プロパティ情報を表示する
  • ~/test$ file hello_qt
    hello_qt: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), not stripped
    
    ~/test$ file hello_qt.o
    hello_qt.o: ELF 32-bit LSB relocatable, ARM, version 1, not stripped

    どちらもELFファイルですが、ターゲットファイルはrelocatable、実行可能ファイルはexecutableです.
  • readefツール:ELFファイルの詳細を表示する
  • ~/test$ readelf -h hello_qt
    ELF Header:
      Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
      Class:                             ELF32
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            ARM
      ABI Version:                       0
      Type:                              EXEC (Executable file)
      Machine:                           ARM
      Version:                           0x1
      Entry point address:               0x87f8
      Start of program headers:          52 (bytes into file)
      Start of section headers:          3948 (bytes into file)
      Flags:                             0x202, has entry point, GNU EABI, software FP
      Size of this header:               52 (bytes)
      Size of program headers:           32 (bytes)
      Number of program headers:         6
      Size of section headers:           40 (bytes)
      Number of section headers:         27
      Section header string table index: 24
    
    ~/test$ readelf -h hello_qt.o
    ELF Header:
      Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
      Class:                             ELF32
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            ARM
      ABI Version:                       0
      Type:                              REL (Relocatable file)
      Machine:                           ARM
      Version:                           0x1
      Entry point address:               0x0
      Start of program headers:          0 (bytes into file)
      Start of section headers:          1040 (bytes into file)
      Flags:                             0x200, GNU EABI, software FP
      Size of this header:               52 (bytes)
      Size of program headers:           0 (bytes)
      Number of program headers:         0
      Size of section headers:           40 (bytes)
      Number of section headers:         16
      Section header string table index: 13
    -hオプションELFファイルのファイルヘッダ情報を読み込みます.この2つの値に注意してください.TypeとEntry point addressです.Type情報はfileのファイルタイプであり、
    Entry point addressは、ファイルの実行エントリポイントを表し、実行可能ファイルのみが値を持つが、ターゲットファイルはリダイレクト可能ファイルであり、直接実行できないため、この値は0である.
    ターゲットファイルの両方は次のとおりです.
    Type:                              REL (Relocatable file)
    Entry point address:               0x0
    実行可能ファイルの両方は、次のとおりです.
    Type:                              EXEC (Executable file)
    Entry point address:               0x87f8