执行目标文件引发的问题:syntax error: word unexpected (expe...

今天不小心把一个目标文件当成了可执行文件放到开发板上进行执行,结果出现了这样一个问题:./hello_qt: line 1: syntax error: word unexpected (expecting ")"),因为以前没有碰到过这事,一时间有点蒙,就是一个简单的hello world按道理不会有问题才对。于是google了一下,原来是一个小小的-c编译选项搞得鬼。顺带也扩展学习总结了一下。

arm和pc上执行目标文件的区别

一般来说,gcc -c选项编译出来的目标文件是不可执行的,因此也就不会遇到这种问题,尤其是在PC上就更是如此。我这边是因为把文件转windows工作台,再通过tftp下载的开发板上,然后文件就全部是普通文件,都是自己chmod +x改的可执行,一时大意才难得碰上这问题。

  • PC上执行目标文件的错误提示

?


1

2

~/test$ ./zh_display.o

-bash: ./zh_display.o: cannot execute binary file

  • ARM上执行交叉编译目标文件的错误提示

?


1

2

$ ./hello_qt

./hello_qt: line 1: syntax error: word unexpected (expecting ")")

PC上的提示信息一看就懂,而ARM上的就会让人莫名奇妙了。一开始我怀疑是自己代码有问题,还反复检查了一遍,幸好只是一个简单的hello world程序,不然够我郁闷的。也多亏我及时google,否则还不知道要浪费多少时间在这小问题上,有时候google真的很重要呀!!

区分目标文件和可执行文件

目标文件和可执行文件平时都是很容易区分的,所以一般也不会注意这个。不过从今天的问题上,我又学到了不少关于两者差别的东西,还有区分两者的Linux工具。

  • file工具:查看文件的基本属性信息

?


1

2

3

4

5

~/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

  • readelf工具:查看ELF文件的详细信息

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

~/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文件的文件头信息,注意其中的两项值:Type 和 Entry point address。Type信息就是file中的文件类型,而 Entry point address表示文件的执行入口点,只有可执行文件该项才有值,而目标文件是可重定向文件,还不可以直接执行,因此该项值为0.

目标文件两者为:

?


1

2

Type:                              REL (Relocatable file)

Entry point address:               0x0

而可执行文件两者为:

?


1

2

Type:                              EXEC (Executable file)

Entry point address:               0x87f8

执行目标文件引发的问题:syntax error: word unexpected (expe...

时间: 2024-10-09 05:19:17

执行目标文件引发的问题:syntax error: word unexpected (expe...的相关文章

line: 1: Syntax error: word unexpected (expecting ")")

开发板上运行可执行程序报出错误: line1: 1: Syntax error: word unexpected (expecting ")") 解决思路: 1.编译器的问题 用arm-linux-gcc编译,可能原来是用gcc编译的. 假如是脚本,#!/bin/sh 改 #!/bin/bash试试. 2.文件完整性 重新烧写或上传一遍. 3.编译命令问题 比如我的一个测试程序test.c : arm-linux-gcc -o test.o -c test.c    //编译为目标文件

可执行程序无法在Linux上运行,显示line 1: syntax error: word unexpected (expecting ") .

[问题]用arm-linux-gcc编译出来的可执行文件clkCtl,下载到板子上,在Linux下不能运行:./clkCtl: line 1: syntax error: word unexpected (expecting ")") [解决过程]1.网上有人也遇到此问题:Syntax error: word unexpected (expecting ")")http://hi.baidu.com/dsfire/blog/item/5d922458886ad589

linux的shell脚本报错“syntax error near unexpected token `”的解决

今天写了一个shell脚本,老报错检查了一下基本的语法并没有发现错误.后来经过百度解决掉了,现总结如下. 错误现象:执行shell脚本,老报错"syntax error near unexpected token `" 解决办法:vim -b example.sh打开文件,发现文件每一行的末尾多了一个^M,这个问题在使用vim example.sh查看是看不见的,只能通过报错来判断使用vim -b才能发现问题. 因为MS-DOS及Windows是回车+换行来表示换行,因此在Linux下

syntax error near unexpected token(关于跨平台非法字符(^M)的解决方法)

别人写了一个shell拿过来在linux试用,执行报错如下: 仔细查找了还是没找到错误,一直都是报syntax error near unexpected token `{ 网上搜索了一下,找到了端倪,现在简单整理如下: 现在可以判断给我脚本的这位仁兄很有可能是在windows平台上编写的.使用vim -b命令查看文件内容如下: 每一行多了一个^M有木有? 那么接下来就要搞清楚这个^M是什么东东? long long long ago .....  老式的电传打字机使用两个字符来另起新行.一个字

关于报错“syntax error near unexpected token `”和回车换行

本来是很简单一个事情,转过来是因为打字机这事比较有趣-- http://blog.csdn.net/xyp84/archive/2009/08/11/4435899.aspx 摘要一下: 回车 换行 0D 0A <CR> <LF> Carriage Return Line Feed "/r" "/n" win32 0D 0D 0A unix 0D 0A ============淡定的分割线=============== 今天写了个shell脚

shell脚本启动语法错误syntax error near unexpected token &#39;{

执行shell脚本时失败,报语法错误,但脚本内容检查正常 原因为该脚本是在非Linux系统下编辑之后放到系统执行的,文件模式类型非Linux系统匹配的模式类型. 查看文件的模式类型 显示文件的模式类型为 dos 修改文件的模式类型为Linux匹配的 unix 保存之后即可正常启动脚本. shell脚本启动语法错误syntax error near unexpected token '{ 原文地址:https://www.cnblogs.com/zjfjava/p/10708370.html

shell脚本syntax error near unexpected token `done&#39;

1.修改文件类型 执行: vi finddir.sh 输入 :set ff 如果fileformat=dos ,修改为unix: :set ff=unix 执行保存命令: :wq 2.删除隐藏字符 用命令vi -b 打开你的SHELL脚本文件,你会.发现每行脚本最后多了个^M 因为MS-DOS及Windows是回车+换行来表示换行,因此在Linux下用Vim查看在Windows下用VC写的代码,行尾后的"^M"符号,表示的是符. 在Vim中利用替换功能就可以将"^M"

运行shell脚本提示“syntax error near unexpected token for((i=0;i&lt;$length;i++))”

sh脚本如下: #!/usr/bin/env bash county="3 4 5 6 7 8 9 10 11 12 16 29 39 44 53 62 72 84 97 115 128 151 168 187 199 218 230 10079 10239 32478" array=($county) length=${#array[@]} for((i=0;i<$length;i++)) do $HIVE_HOME/bin/hive -e "select * fro

shell出现syntax error near unexpected token `&lt;&#39; 解决方法

最新在看一个shell资料时,按照教材,却出现如下错误,不能运行 如下,简单的脚本: #!/bin/bash cat |while read line do echo $line done < <(data.txt|awk '{print $0}') 运行时,却出现如下错误 [[email protected] shellcookbook]# sh while_test.sh while_test.sh: line 5: syntax error near unexpected token `