当前位置:首页 > 服务端 > 执行目标文件引发的问题:syntax error: word unexpected (expe...

执行目标文件引发的问题: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

作者:@菜鸟爱学习@
来源链接:https://www.cnblogs.com/cainiaoaixuexi/p/3891777.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125734.html

标签: syntax error
分享给朋友:

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