可执行程序无法在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/5d922458886ad589800a188b.html
其是用ftp传到板子上的,是没有传输完整,所以导致运行有问题,
但是我是用的lrz通过secureCRT传的,确保文件是完整的。

2.以为是我烧的uImage和rootfs有问题,又重新烧写一遍,
还是不行。

3.以为编译出来的文件有问题,所以换了arm-linux-uclibc-gcc去编译,结果也还是不行。4.

4.
在一块移植了linux 的开发板上运行两个测试程序出错
http://linux.chinaunix.net/bbs/thread-1064286-1-1.html
中提到用file查看一下,所以去Linux服务器上去查看了一下,看起来好像也是OK的:
file clkCtl
clkCtl: ELF 32-bit LSB relocatable, ARM, version 1 (ARM), not stripped

甚至用了相关工具查看,好像也是OK的:
hexdump n 1 clkCtl
hexdump: n: No such file or directory
hexdump: 1: No such file or directory
0000000 457f 464c 0101 6101 0000 0000 0000 0000
0000010 0001 0028 0001 0000 0000 0000 0000 0000
0000020 0630 0000 0000 0000 0034 0000 0000 0028
。。。

objdump -a clkCtl

clkCtl:     file format elf32-little
clkCtl

objdump -f clkCtl

clkCtl:     file format elf32-little
architecture: UNKNOWN!, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

objdump -h clkCtl

clkCtl:     file format elf32-little

Sections:
Idx Name          Size      VMA       LMA       File off Algn
0 .text         000003e8 00000000 00000000 00000034 2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data         00000000 00000000 00000000 0000041c 2**0
                  CONTENTS, ALLOC, LOAD, DATA
2 .bss          00000004 00000000 00000000 0000041c 2**2
                  ALLOC
3 .rodata       00000190 00000000 00000000 0000041c 2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment      00000012 00000000 00000000 000005ac 2**0
                  CONTENTS, READONLY
5 .note.GNU-stack 00000000 00000000 00000000 000005be 2**0
                  CONTENTS, READONLY
6 .ARM.attributes 00000010 00000000

5.百google度了N个帖子,都没有说出具体问题的,
只有一个帖子说的好像说到点子上了:
After updating to AIR SDK 1.5.1 all Flex AIR apps give "abc bytecode decoding" error
http://bugs.adobe.com/jira/browse/FBE-323

flex_sdk_3/bin/adl_lin: 1: Syntax error: word unexpected (expecting ")")

I‘ve seen this error before and usually its a shell execution problem, but I‘m not quite sure how to fix it here. Usually it‘s

something like change #!/bin/sh to #!/bin/bash, but since adl_lin is a binary file I‘m not sure how to go about fixing it.

FYI: I‘m running Ubuntu 8.04, if that is helpful in anyway.

好像是sh的问题,
但是,去/bin目录下看了,sh好像没问题。
# sh --help
BusyBox v1.13.2 (2009-05-13 11:38:15 CST) multi-call binary

No help available.

实在是无语了。。。。。

【解决办法】
刚看到这个帖子:
Cygwin and NMT toolchain
http://www.networkedmediatank.com/showthread.php?tid=20303
没注意,后来才无意发现,原来其中就说明了原因和介绍了解决办法。。。

一切软件的错误,最终都能找到其原因,此处也不例外。
最后的发现,是我在写个简单的makefile的时候,在写编译命令的时候,写成了:
$(CC) -o $(OUT_FILE) -c $(SRC_FILE)
而实际应该是去掉-c选项,直接编译成可执行文件:
$(CC) -o $(OUT_FILE) $(SRC_FILE)

之前就一直搞混淆了-c参数,以为后面正好跟c文件。。。
现在又弄错了。。。

其中gcc的-c选项的意思是:
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
  gcc -c hello.c
  他将生成.o的obj文件

也就是,如果不加-c,默认就直接编译生成可执行文件了
加上-c就只编译成目标obj文件,就不往下继续编译成可执行文件了。。。

我们实际的命令
arm-linux-gcc -o clkCtl -c clock_control.c
的意思是,将clock_control.c编译成目标文件,此输出的(目标)文件叫做clkCtl
其实如果此处不写-o clkCtl,一般默认输出的文件名是和C文件名一样,只是后缀是.o,此处即clock_control.o的。

arm-linux-gcc -o clkCtl clock_control.c
的意思是,将clock_control.c编译成可执行文件(就是先编译成目标文件然后再链接成可执行文件)
其中输出的文件名是clkCtl,如果不加上-o clkCtl ,那么Linux默认输出文件名就是a.out了,
容易混淆而且容易被覆盖,也没实际意义,所以一般加上-o 制定输出的可执行程序的文件名。

另外,说一下,gcc还有个参数是大写的C:
-C
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
注意不要和这个小写的c混淆了。。。

【附录】
gcc参数详解
http://man.lupaworld.com/content/develop/UNIX_system_develop_gcc.htm

【总结】
其他朋友们,遇到这个问题,估计不少也是和我一样,
就是在编译的时候,错误地加入了-c 选项,使得生成出来的不是可执行文件,是目标文件,
所以运行的时候,就无法运行了。

感慨一句,这么基本的基础知识都忘了,丢人啊。。。。

【后记】

其实是自己的相关知识还是不够,把目标文件的信息,看成是可执行文件的信息了,因为刚才又去用file看了真正可执行文件的信息,和之前file查看目标文件的结果是不一样的:

[[email protected] clock_control]$ file clock_control.o
clock_control.o: ELF 32-bit LSB relocatable, ARM, version 1 (ARM), not stripped
[[email protected] clock_control]$ file clkCtl
clkCtl: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked (uses shared libs), not stripped
[[email protected]t clock_control]$

如果之前就具备这些知识,那么也就可以看出毛病了。还有,如果脑子灵活点,用file去查看其他已经有的可执行文件,然后和上面的比较,也是可以看出来的。还是方法不当啊。。。

同样,用readelf工具查看也可以看清楚具体信息:

[[email protected] clock_control]$ readelf -h clkCtl
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:               0x854c
Start of program headers:          52 (bytes into file)
Start of section headers:          5036 (bytes into file)
Flags:                             0x2, has entry point, GNU EABI
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:         31
Section header string table index: 28
[[email protected] clock_control]$ ls
clkCtl clock_control.c clock_control.h clock_control.o clock-dev.ko makefile ReadMe.txt
[[email protected] clock_control]$ readelf -h clock_control.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:          1584 (bytes into file)
Flags:                             0x0
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:         12
Section header string table index: 9

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

时间: 2024-10-16 05:03:26

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

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    //编译为目标文件

运行shell脚本提示“syntax error near unexpected token for((i=0;i<$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

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下

【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行.我这里有个在windows上搭建过的程序,我们主要演示如何在linux上运行,所以大家不要纠结于这些,大家可以新建一个web项目尝试一下. 安装.NET Core SDK for CentOS 微软有详细的安装命令,可以参考Install

发布项目到 Linux 上运行 Core 项目

发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行.我这里有个在windows上搭建过的程序,我们主要演示如何在linux上运行,所以大家不要纠结于这些,大家可以新建一个web项目尝试一下. 安装.NET Core SDK for CentOS

在Linux上运行ASP.NET vNext

最新的ASP.NET vNext完全开源且可以跨多个平台运行,在Windows环境下我尝试了下,几乎没花什么工夫就跑起了Sample,而在Linux环境下则要多花了不少时间,所以特别记录下整个过程,希望对其他想要尝鲜的人有所帮助. 运行环境 Ubuntu Server 14.04 VirtualBox Mono >= 3.4.1 *由于Ubuntu库中的Mono版本比较陈旧,满足不了最低要求,所以第一步要做的就是安装最新版本的Mono. 安装Mono 1. 首先从GitHub上取得mono代码:

在Linux上运行C#

在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个最根本的需求是库.编译器/解释器.运行环境.库以类和方法(函数)的形式提供常用的例程,简化大型程序的编写..NET框架也不例外,包含了许多类库.另外,把程序转换成可执行形式以及运行执行文件时,编译器和运行环境是必不可少的.Mono软件包包含了.NET类库的一部分.一个C#编译器和.NET运行环境CLR(Common Language Runtime,公共语言运行时环境). Mono声称支持Linux.Solaris.Free BSD和M

让Qt在MIPS Linux上运行 good

下载 首先下载Qt everywhere,当前的版本是4.7.2,可以从nokia的网站上下载,也可以从git服务器上下载.考虑到文件有200M 以上的大小,下载速率低于25kBPS的,需要考虑从什么地方复制一份,否则需要等待较长时间才能下载下来.我是在家里下载这个文件的,所以开始编译已经是第二天了.考虑提升员工效率的话,需要预先预备好这些下载文件,或者增加接入带宽. 解压 第一步下载的文件是一个tar包,所以需要解压,通常解压需要在unix/Linux环境下进行,如果只是看代码,windows

【Java】Java程序打包成jar包在Linux上运行

当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在MyEclipse中选中需要打包的项目,点击右键,选择:Export... 如下图所示: (2)然后在弹出的窗口中选择:Java-->Runnable JAR file,然后点击:Next,如下图所示: (3)然后选择需要打包的程序和保存的地方,然后点击:Finish,如下图所示: 这样Java程序