文档章节

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

水海云
 水海云
发布于 2013/03/22 19:13
字数 907
阅读 9222
收藏 1

今天不小心把一个目标文件当成了可执行文件放到开发板上进行执行,结果出现了这样一个问题:./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

  • readelf工具:查看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文件的文件头信息,注意其中的两项值: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

© 著作权归作者所有

水海云
粉丝 50
博文 120
码字总数 101938
作品 0
深圳
程序员
私信 提问
net-snmp移植过程中遇到的问题

在源码包目录下执行的全部操作如下,麻烦帮我哪一步有问题才导致之前描述的问题,谢谢! [root@0 net-snmp-5.7.3]# make clean [root@0 net-snmp-5.7.3]# CC=arm-linux-gcc [root@0 net-snmp...

linuxstudy
2014/12/17
538
0
ubuntu16.04卸载自带python 后出现问题

如题,问题如下: ubuntu命令行安装软件时,出现如下错误: Preparing to unpack .../python3-software-properties_0.96.20.7_all.deb ... import: unable to grab mouse `': Resource temp......

drivesoul
2018/04/18
3K
0
NET-SNMP移植

@Yisen 你好,想跟你请教个问题: net-snmp移植时,在虚拟机上编译后,把安装目录下的sbin目录下的snmpd传到板子上的bin目录下,出现下面的问题,请问是什么原因?谢谢。 问题如下: /bin #...

linuxstudy
2014/12/17
1K
10
怎么解决syntax error, unexpected ':', expecting end of file的语法错误

Discuz程序下,模板引发的语法错误。 问题出现时间,每次修复后,十几天再反复出现。 任何页面点击标题,无法显示内容,出现提示syntax error, unexpected ':', expecting end of file 官方默...

169china
2017/10/11
708
1
use go version go1.3.3 linux/386;go get beego.meet a problem

@astaxie 你好,想跟你请教个问题: use go version go1.3.3 linux/386 go get github.com/astaxie/beego make a problem: # github.com/astaxie/beego src/github.com/astaxie/beego/tree.......

zhengyijie
2016/03/18
260
0

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之5分钟解决单点登陆(53)

SpringBoot2.X心法总纲 1、pom文件依赖 <dependency> <groupId>com.majiaxueyuan</groupId> <artifactId>sso-core</artifactId> <version>1.2.2</version></dependency> 2、......

木九天
17分钟前
13
0
面向对象和面向过程的区别

面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对...

无名氏的程序员
18分钟前
10
0
OpenStack大事记

2010年7月19日,Rackspace、NASA、Citrix、Dell共同开发并发布OpenStack第一个版本。 2011年10月,Rackspace放弃OpenStack控制权,交由一新成立的OpenStack基金会管理。 2012年5月NASA宣布退...

大别阿郎
19分钟前
8
0
面向对象的简单应用—以交通工具(Vehicle)为列

请定义一个交通工具(Vehicle)的类其中有: 属性: 速度(speed)、 体积(size)等,方法:移动(move())、设置速度(setSpeed(int speed))、加速 speedUp()、减速 speedDown()等。最后在测试类 Ve...

INEVITABLE
29分钟前
7
0
通往艺术家之路

通往艺术家之路 并发编程中,开发者往往需要权衡锁的颗粒粗细,锁住的代码块太大呢会导致可能的线程堵塞,锁的颗粒太细呢又会因为频繁地加锁解锁导致系统用户态内核态的转换从而消费很多时间...

StupidZhe
30分钟前
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部