当前位置: 技术问答>linux和unix
请教编译问题。
来源: 互联网 发布时间:2015-11-10
本文导语: 我的Makefile: CC = arm-linux-gcc AR = arm-linux-ar LD = arm-linux-ld KERNELDIR = /XXXX/XXX/XXX/linux-2.4.X include $(KERNELDIR)/.config CFLAGS = -mbig-endian -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O -Wall #ifdef CONFIG_SMP #CFLAGS += -D__SMP__ -DS...
我的Makefile:
CC = arm-linux-gcc
AR = arm-linux-ar
LD = arm-linux-ld
KERNELDIR = /XXXX/XXX/XXX/linux-2.4.X
include $(KERNELDIR)/.config
CFLAGS = -mbig-endian -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O -Wall
#ifdef CONFIG_SMP
#CFLAGS += -D__SMP__ -DSMP
#endif
all:AAA.o
AAA.o:BBB.o CCC.o DDD.o EEE.o
$(LD) -r $^ -o $@
clean:
rm -rf *.o
touch *.c *.h
为什么连接时报错:
arm-linux-ld: BBB.o: compiled for a big endian system and target is little endian
File in wrong format: failed to merge target specific data of file BBB.o
如何把target变为big endian 。
CC = arm-linux-gcc
AR = arm-linux-ar
LD = arm-linux-ld
KERNELDIR = /XXXX/XXX/XXX/linux-2.4.X
include $(KERNELDIR)/.config
CFLAGS = -mbig-endian -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O -Wall
#ifdef CONFIG_SMP
#CFLAGS += -D__SMP__ -DSMP
#endif
all:AAA.o
AAA.o:BBB.o CCC.o DDD.o EEE.o
$(LD) -r $^ -o $@
clean:
rm -rf *.o
touch *.c *.h
为什么连接时报错:
arm-linux-ld: BBB.o: compiled for a big endian system and target is little endian
File in wrong format: failed to merge target specific data of file BBB.o
如何把target变为big endian 。
|
说的是你的文件格式的问题
ig-Endian 和 Little-Endian 字节排序
字节排序 含义
Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。
Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。
必须注意的是:一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。
一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
(注意:0xab换算成2进制是10101011,是个8位的数。)
-----------
疑问:为什么要以一个Word为基础单位来分割而不是一个DoubleWord或者Byte?究竟就是这么定义的还是跟具体的CPU有关,跟具体的模式(比如说16位模式、32位模式、64位模式的LE和BE定义会不同)有关?我实在是不清楚,望知道的大侠不吝指点,也希望有这方面资料(文章、代码)的朋友贴一些上来。
posted on 2005-02-22 23:59 乾坤一笑
ig-Endian 和 Little-Endian 字节排序
字节排序 含义
Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。
Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。
必须注意的是:一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。
一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
(注意:0xab换算成2进制是10101011,是个8位的数。)
-----------
疑问:为什么要以一个Word为基础单位来分割而不是一个DoubleWord或者Byte?究竟就是这么定义的还是跟具体的CPU有关,跟具体的模式(比如说16位模式、32位模式、64位模式的LE和BE定义会不同)有关?我实在是不清楚,望知道的大侠不吝指点,也希望有这方面资料(文章、代码)的朋友贴一些上来。
posted on 2005-02-22 23:59 乾坤一笑
|
同意alaiyeshi(七宝树八宝饭)
因为你编译选项指定是BigEndian (CFLAGS = -mbig-endian), 而一般的库是LittleEndian的, 所以链接(arm-linux-ld)的时候会报不匹配.
解决方法:
1, 要么编译时候指定LittleEndian;
2, 要么链接的时候通过不同的搜索路径选择现成的BigEndian 的库,或者重新编译成BigEndian 的库;
因为你编译选项指定是BigEndian (CFLAGS = -mbig-endian), 而一般的库是LittleEndian的, 所以链接(arm-linux-ld)的时候会报不匹配.
解决方法:
1, 要么编译时候指定LittleEndian;
2, 要么链接的时候通过不同的搜索路径选择现成的BigEndian 的库,或者重新编译成BigEndian 的库;
|
难道是
$(LD) -r $(CFLAGS) $^ -o $@
$(LD) -r $(CFLAGS) $^ -o $@
|
AAA.o:BBB.o CCC.o DDD.o EEE.o
$(LD) -r $^ -o $@
你把上面的$(LD)那行加上-mbig-endian 试一下,不太确定。
$(LD) -r $^ -o $@
你把上面的$(LD)那行加上-mbig-endian 试一下,不太确定。
|
所谓word是指机器的字长,未必就一定是16位,现在通常都是32位了。