最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】给定多个C文件和多个.S汇编文件,如何用他们生成单个.o目标文件

C crifan 4115浏览 0评论

【已解决】给定多个C文件和多个.S汇编文件,如何用他们生成单个.o目标文件

【问题】

当然编译uboot下面的bch库,在加入对应C源码和.S汇编之后,编译是正常的:

arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o lowlevel_init.o lowlevel_init.S 
arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o bch/bch_enc4t.o bch/bch_enc4t.S 
arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o bch/bch_dec4t.o bch/bch_dec4t.S 
arm-linux-uclibc-gcc -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -Wall -Wstrict-prototypes -fno-stack-protector -c -o bch/bch_gf.o bch/bch_gf.c 
arm-linux-uclibc-gcc -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -Wall -Wstrict-prototypes -fno-stack-protector -c -o bch/bch_lut.o bch/bch_lut.c 
arm-linux-uclibc-gcc -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -Wall -Wstrict-prototypes -fno-stack-protector -c -o bch/bch_dec.o bch/bch_dec.c 
arm-linux-uclibc-ar crv libas3536.a as3536.o asdebug.o ccu.o ssp.o ssp_nor.o enc28j60.o i2c_driver_polling.o as353x_nand.o shuffle.o mpmc_driver.o lowlevel_init.o bch/bch_enc4t.o bch/bch_dec4t.o bch/bch_gf.o bch/bch_lut.o bch/bch_dec.o

可以看到,编译后,每个C文件和汇编文件都对应一个.o文件,但是我又不想在release的时候,release多个.o文件,想要把这些多个.o文件,生成单个的.o文件,所以,此处的需求就是:

已经有了两个汇编文件bch/bch_enc4t.S bch/bch_dec4t.S和四个C文件bch/bch_gf.c bch/bch_lut.c bch/bch_dec.c,如何将这些文件,共同制作出来单个的.o文件。

【解决过程】

1.首先有人会问了,为何你为要多个.o弄成一个.o,而不是多个.o正常的用ar制作出一个.a的库文件?

回答是,此处已经可以实现了你所说的:

arm-linux-uclibc-ar rcv bch_4_s_romtable.a bch/bch_enc4t.o bch/bch_dec4t.o bch/bch_gf.o bch/bch_lut.o bch/bch_dec.o

但是,由于此处uboot的makefile规则所决定的,没法在当前目录中,将其加入上面显示的:

arm-linux-uclibc-ar crv libas3536.a as3536.o asdebug.o ccu.o ssp.o ssp_nor.o enc28j60.o i2c_driver_polling.o as353x_nand.o shuffle.o mpmc_driver.o lowlevel_init.o bch/bch_enc4t.o bch/bch_dec4t.o bch/bch_gf.o bch/bch_lut.o bch/bch_dec.o

中的libas3536.a中,因此最后编译,会找不到bch的相关函数,即使此处用生成好的.a,加入到ar中去制作as3536.a,是可以,但是最后在ld生成uboot的时候会出错,显示File format not recognized:

。。。

cd /home/crifan/uboot_as3536/u-boot-2009.03 && arm-linux-uclibc-ld -Bstatic -T /home/crifan/uboot_as3536/u-boot-2009.03/board/ams/as3536/u-boot.lds -Ttext 0x00000000 $UNDEF_SYM cpu/arm926ejs/start.o 
--start-group lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm926ejs/libarm926ejs.a cpu/arm926ejs/ams/libams.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a fs/yaffs2/libyaffs2.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/fpga/libfpga.a drivers/gpio/libgpio.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/ubi/libubi.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a board/ams/as3536/libas3536.a --end-group -L /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4 -lgcc 
-Map u-boot.map -o u-boot 
arm-linux-uclibc-objdump: bch_4_s_romtable.a: File format not recognized 
board/ams/as3536/libas3536.a(as353x_nand.o): In function `as353x_correct_data': 
/home/crifan/uboot_as3536/u-boot-2009.03/board/ams/as3536/as353x_nand.c:1111: undefined reference to `bchDecode' 
board/ams/as3536/libas3536.a(as353x_nand.o): In function `as353x_calculate_ecc': 
/home/crifan/uboot_as3536/u-boot-2009.03/board/ams/as3536/as353x_nand.c:1081: undefined reference to `bchEncodeT4'

当然,如果只是想把bch库加入进入,使得可以正常编译链接通过,那肯定是可以的,只需要简单的,把

bch_4_s_romtable.a加入到uboot根目录下的Make中,即:

把这个:

$(obj)u-boot:   depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) 
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | 
sed -n -e 's/.*($(SYM_PREFIX)__u_boot_cmd_.*)/-u1/p'|sort|uniq`; 
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) 
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) 
-Map u-boot.map -o u-boot

改成:

$(obj)u-boot:   depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) 
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | 
sed -n -e 's/.*($(SYM_PREFIX)__u_boot_cmd_.*)/-u1/p'|sort|uniq`; 
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) 
--start-group board/ams/as3536/bch/bch_4_s_romtable.a $(__LIBS) --end-group $(PLATFORM_LIBS) 
-Map u-boot.map -o u-boot

即可正常编译链接成功,生成正常的uboot了。

但是,此处我希望实现的是,不去改变顶层的uboot中的makefile,而只是在board/ams/as3536/下面,

改动其makefile,达到将此bch加入进去,以使得正常编译通过的目的。

2.而在board/ams/as3536/下面的makefile中,

我尝试了:

LIB = $(obj)lib$(BOARD).a

COBJS := as3536.o asdebug.o ccu.o ssp.o ssp_nor.o enc28j60.o i2c_driver_polling.o as353x_nand.o shuffle.o mpmc_driver.o 
#SOBJS := lowlevel_init.o bch/bch_enc4t.o bch/bch_dec4t.o 
SOBJS := lowlevel_init.o 
#BCH_COBJS := bch/bch_gf.o bch/bch_lut.o bch/bch_dec.o

SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) 
OBJS := $(addprefix $(obj),$(COBJS)) 
SOBJS := $(addprefix $(obj),$(SOBJS)) 
BCH_OBJS :=$(addprefix $(obj),$(BCH_COBJS))

#$(LIB): $(obj).depend $(OBJS) $(SOBJS) $(BCH_COBJS) 
# $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) $(BCH_COBJS) 
$(LIB): $(obj).depend $(OBJS) $(SOBJS) 
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)

在LIB = $(obj)lib$(BOARD).a

下面添加一行:

LIB += bch/bch_4_s_romtable.a

结果实际上,make后,也是没有传递到uboot中,还是缺少bch对应的函数。

所以,此处是希望,有了多个c文件和多个汇编文件,如果获得单个object目标文件,以方便后面

类似于:

arm-linux-uclibc-ar crv libas3536.a as3536.o asdebug.o ccu.o ssp.o ssp_nor.o enc28j60.o i2c_driver_polling.o as353x_nand.o shuffle.o mpmc_driver.o lowlevel_init.o bch/bch_4_s_romtable.o

一样,将这个单个的bch的目前文件,ar加入到libas3536.a里面,这样,最后uboot编译链接,就可以正常了。

3.曾经尝试了:

[crifan@linux-41lh bch]$arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o bch_4_s_romtable.obj bch_gf.c bch_lut.c bch_dec.c bch_enc4t.S bch_dec4t.S -combine

cc1: error: too many filenames given. Type cc1 –help for usage

对于显示的cc1的错误,一直没完全搞懂是什么原因。

因为刚刚试了下,

单个s文件和多个C文件是可以的:

arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o bch_4_s_romtable.obj bch_gf.c bch_lut.c bch_dec.c bch_enc4t.S -combine

而且,对于as来说,多个汇编也是可以的:

[crifan@linux-41lh bch]$arm-linux-uclibc-as bch_enc4t.S bch_dec4t.S

但是,对于上面的,4个c文件,2个汇编文件,就不能正常编译了。所以,很是迷惑。。。

忘了说了,对于多个C文件,上面的arm-linux-uclibc-gcc是可以正常编译,生成单个目标文件的,只是需要加个参数-combine,详见:

【已解决】arm-linux-uclibc-objdump: libbch.a : File format not recognized

http://hi.baidu.com/serial_story/blog/item/798f6afb4a00861d6c22eb8e.html

4.刚刚去找了,关于:

cc1: error: too many filenames given

(注:google搜索时,最好把分隔符之类的都去掉,如cc1 error too many filenames given,才能搜到有用信息)

找到了一些:

(1)http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37973

这个人也是遇到了,但是没人解决。

(2)http://old.nabble.com/cc1.exe:-error:-too-many-filenames-given-td19606899.html

这人说道“IIRC, –combine -fwhole-program can only be done for C language. The assembler files (.S) are not even run through the compiler, they are just passed down straight to the assembler, so it won’t be using –combine at all.

好像我这里的arm-linux-uclibc-gcc,不加-combine,无法同时编译多个c文件。但是对于汇编文件,即使加了,好像同时编译多个c文件,1个汇编文件,也是可以的。也就是说,应该也是识别的,不过是要记得加-D__ASSEMBLY__ 。

http://bugs.gentoo.org/show_bug.cgi?id=275254

中,遇到同样问题,但是最后说是“Replace CFLAGS with CPPFLAGS”就可以解决了。。。 而我这里,是直接手动加的参数,好像和他的不一样。。。。

(3)http://cp3wks05.fynu.ucl.ac.be/twiki/bin/view/Software/HowotoinstallMadGRpahonSuSe102

这个人,好像说到的问题的重点,其也是用的是SUSE,然后遇到了类似的问题,并且都一个个解决了:

“Due to some "non-standardness" of SuSe 10.2 the straight setup procedure of MG_ME_V4.1.xx doesn’t work. Here follows how it worked on several workstation running SuSe 10.2 both i586 and x86_64.

。。。。。。。

  • Third issue is again

f77 -O -ffixed-line-length-132 -o decay decay_couplings.o decay.o decay_matrix.o decay_mom.o decay_event.o vegas.o decay_printout.o hdecay.o ran1.o rw_events.o open_file.o alfas_functions.o ../HELAS/lib/libdhelas3.a f77: ../HELAS/lib/libdhelas3.a: No such file or directory make[1]: * [all] Error 1 make[1]: Leaving directory `/home/roberto/MG_ME_V4.1.24/DECAY’ make: * [decay] Error 2

If you still have this problem then change to folder and issue make. You should get

~/MG_ME_V4.1.24/HELAS> make

f77 -O -I. -c httsxx.F

cc1: error: too many filenames given. Type cc1 –help for usage

# 1 "httsxx.F"

make: *** [httsxx.o] Error 1

To fix it you have to edit /usr/lib/gcc-lib/i586-suse-linux/3.3.5/specs Open this file and look for:

*cpp_options:

%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{g*} %{O*} %{undef}

edit this line replacing "%{O*}" by "-o"

These are all the erros i had to fix to make MG compile on suse linux, 。。。。。。。。”

而我这里,由于用的是交叉编译器,所以,并不能通过直接去改SUSE里面的那些gcc而解决我的问题,估计要重新编译整套arm-linux-交叉编译的工具链才行。

看来问题很可能就是这个版本的SUSE下制作出来的工具链的这个问题。去查看了下,我这里的环境是

openSUSE 11.1,编译器的信息是:

[crifan@linux-41lh bch]$arm-linux-gcc -v 
Using built-in specs. 
Target: arm-linux-uclibc 
Configured with: /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi 
Thread model: posix 
gcc version 4.2.4

编译出错时的详细编译信息:

[crifan@linux-41lh bch]$arm-linux-uclibc-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/uboot_as3536/u-boot-2009.03/include -fno-builtin -ffreestanding -nostdinc -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -combine -o bch_4_s_romtable.obj -c bch_enc4t.S bch_dec4t.S bch_gf.c bch_lut.c bch_dec.c -v 
Using built-in specs. 
Target: arm-linux-uclibc 
Configured with: /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi : (reconfigured) /home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir --with-build-time-tools=/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --disable-tls --enable-shared --with-gmp=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/gmp --with-mpfr=/home/eric/buildroot/buildroot-2009.08/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib --with-float=soft --with-abi=apcs-gnu --with-arch=armv5te --with-tune=arm9tdmi 
Thread model: posix 
gcc version 4.2.4 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../libexec/gcc/arm-linux-uclibc/4.2.4/cc1 -E -lang-asm -quiet -nostdinc -v -I/home/crifan/uboot_as3536/u-boot-2009.03/include -iprefix /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/ -D__ASSEMBLY__ -D__KERNEL__ -DTEXT_BASE=0x00000000 -DCONFIG_ARM -D__ARM__ -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include bch_enc4t.S bch_dec4t.S -msoft-float -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -mtune=arm9tdmi -fno-strict-aliasing -fno-common -ffixed-r8 -fno-builtin -ffreestanding -fworking-directory -Os -o - | 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/../../../../arm-linux-uclibc/bin/as --gdwarf2 -march=armv5te -mfloat-abi=soft -o bch_4_s_romtable.obj 
#include "..." search starts here: 
#include <...> search starts here: 
/home/crifan/uboot_as3536/u-boot-2009.03/include 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include 
End of search list. 
cc1: error: too many filenames given. Type cc1 --help for usage 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../libexec/gcc/arm-linux-uclibc/4.2.4/cc1 -quiet -nostdinc -v -I/home/crifan/uboot_as3536/u-boot-2009.03/include -iprefix /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/ -D__ASSEMBLY__ -D__KERNEL__ -DTEXT_BASE=0x00000000 -DCONFIG_ARM -D__ARM__ -isystem /home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include bch_gf.c bch_lut.c bch_dec.c -quiet -dumpbase bch_gf.c -msoft-float -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -mtune=arm9tdmi -auxbase-strip bch_4_s_romtable.obj -g -Os -version -fno-strict-aliasing -fno-common -ffixed-r8 -fno-builtin -ffreestanding -o - | 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/../../../../arm-linux-uclibc/bin/as -march=armv5te -mfloat-abi=soft -o bch_4_s_romtable.obj 
#include "..." search starts here: 
#include <...> search starts here: 
/home/crifan/uboot_as3536/u-boot-2009.03/include 
/home/eric/buildroot/buildroot-2009.08/build_arm/staging_dir/usr/bin/../lib/gcc/arm-linux-uclibc/4.2.4/include 
End of search list. 
GNU C version 4.2.4 (arm-linux-uclibc) 
compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291]. 
GGC heuristics: --param ggc-min-expand=97 --param ggc-min-heapsize=126593 
Compiler executable checksum: 07af4830ad3752d283d346e261dbcd0d

此问题有待后续验证:自己单独去ubuntu编译一个工具链,然后用其去编译我的代码,看看是否会出现同样的问题。

5.回来,经过验证,在ubuntu 9.10 + buildroot 2009.11编译出来的EABI版本的arm-linux-交叉编译工具链,

去作上面同样的事情,出现同样的问题:

crifan@crifan-laptop:bch$ arm-linux-gcc -D__ASSEMBLY__ -g -Os   -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x00000000 -I/home/crifan/develop/uboot/u-boot-2009.03_toHome/include -fno-builtin -ffreestanding -nostdinc -isystem /home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -c -o bch_4_s_romtable.obj bch_gf.c bch_lut.c bch_dec.c bch_enc4t.S bch_dec4t.S -combine -v 
Using built-in specs. 
Target: arm-linux-uclibcgnueabi 
Configured with: /home/crifan/develop/buildroot/buildroot-2009.11/output/toolchain/gcc-4.3.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibcgnueabi --enable-languages=c --with-sysroot=/home/crifan/develop/buildroot/buildroot-2009.11/output/staging --with-build-time-tools=/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/arm-linux-uclibcgnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-libssp --enable-tls --enable-shared --with-gmp=/home/crifan/develop/buildroot/buildroot-2009.11/output/toolchain/gmp --with-mpfr=/home/crifan/develop/buildroot/buildroot-2009.11/output/toolchain/mpfr --disable-nls --enable-threads --disable-multilib --disable-decimal-float --with-float=soft --with-abi=aapcs-linux --with-arch=armv5te --with-tune=arm9tdmi 
Thread model: posix 
gcc version 4.3.4 (GCC) 
COLLECT_GCC_OPTIONS='-D__ASSEMBLY__' '-g' '-Os' '-fno-strict-aliasing' '-fno-common' '-ffixed-r8' '-msoft-float' '-D__KERNEL__' '-DTEXT_BASE=0x00000000' '-I/home/crifan/develop/uboot/u-boot-2009.03_toHome/include' '-fno-builtin' '-ffreestanding' '-nostdinc' '-isystem' '/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include' '-pipe' '-DCONFIG_ARM' '-D__ARM__' '-march=armv5te' '-mabi=apcs-gnu' '-mno-thumb-interwork' '-c' '-o' 'bch_4_s_romtable.obj' '-combine' '-v' '-mtune=arm9tdmi' 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../libexec/gcc/arm-linux-uclibcgnueabi/4.3.4/cc1 -quiet -nostdinc -v -I/home/crifan/develop/uboot/u-boot-2009.03_toHome/include -iprefix /home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/ -D__ASSEMBLY__ -D__KERNEL__ -DTEXT_BASE=0x00000000 -DCONFIG_ARM -D__ARM__ -isystem /home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include bch_gf.c bch_lut.c bch_dec.c -quiet -dumpbase bch_gf.c -msoft-float -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -mtune=arm9tdmi -auxbase-strip bch_4_s_romtable.obj -g -Os -version -fno-strict-aliasing -fno-common -ffixed-r8 -fno-builtin -ffreestanding -o - | 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/../../../../arm-linux-uclibcgnueabi/bin/as -march=armv5te -mfloat-abi=soft -meabi=gnu -o bch_4_s_romtable.obj 
#include "..." search starts here: 
#include <...> search starts here: 
/home/crifan/develop/uboot/u-boot-2009.03_toHome/include 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include 
End of search list. 
GNU C (GCC) version 4.3.4 (arm-linux-uclibcgnueabi) 
compiled by GNU C version 4.4.1, GMP version 4.2.4, MPFR version 2.4.1-p5. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: 35aadf35a10982bb95d09027a81d2626 
COLLECT_GCC_OPTIONS='-D__ASSEMBLY__' '-g' '-Os' '-fno-strict-aliasing' '-fno-common' '-ffixed-r8' '-msoft-float' '-D__KERNEL__' '-DTEXT_BASE=0x00000000' '-I/home/crifan/develop/uboot/u-boot-2009.03_toHome/include' '-fno-builtin' '-ffreestanding' '-nostdinc' '-isystem' '/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include' '-pipe' '-DCONFIG_ARM' '-D__ARM__' '-march=armv5te' '-mabi=apcs-gnu' '-mno-thumb-interwork' '-c' '-o' 'bch_4_s_romtable.obj' '-combine' '-v' '-mtune=arm9tdmi' 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../libexec/gcc/arm-linux-uclibcgnueabi/4.3.4/cc1 -E -lang-asm -quiet -nostdinc -v -I/home/crifan/develop/uboot/u-boot-2009.03_toHome/include -iprefix /home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/ -D__ASSEMBLY__ -D__KERNEL__ -DTEXT_BASE=0x00000000 -DCONFIG_ARM -D__ARM__ -isystem /home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include bch_enc4t.S bch_dec4t.S -msoft-float -march=armv5te -mabi=apcs-gnu -mno-thumb-interwork -mtune=arm9tdmi -fno-strict-aliasing -fno-common -ffixed-r8 -fno-builtin -ffreestanding -fworking-directory -Os -fno-directives-only -o - | 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/../../../../arm-linux-uclibcgnueabi/bin/as --gdwarf2 -march=armv5te -mfloat-abi=soft -meabi=gnu -o bch_4_s_romtable.obj 
#include "..." search starts here: 
#include <...> search starts here: 
/home/crifan/develop/uboot/u-boot-2009.03_toHome/include 
/home/crifan/develop/buildroot/buildroot-2009.11/output/staging/usr/bin/../lib/gcc/arm-linux-uclibcgnueabi/4.3.4/include 
End of search list. 
cc1: error: too many filenames given. Type cc1 --help for usage

所以,初步判断,我这里的问题,不是上面那个人说的SUSE的问题,看来还是哪里没搞清楚,有待以后有机会再解决了。

 

【后记】

后来,无意间,发现,原来是汇编文件的原因,上面的汇编文件是大S结尾,.S文件,这样编译就会出现:

cc1: error: too many filenames given. Type cc1 –help for usage

而改为正常的小s结尾的.s文件后,即将bch_enc4t.S bch_dec4t.S改为bch_enc4t.s bch_dec4t.s就可以正常编译了。

根本原因不详,个人猜测,好像是汇编的.S是预处理之后的文件吧,不能正常识别为最原始的.s汇编文件,所以不能一起编译。

6. 关于多个多个目前文件合并成单个目标文件的事情,google找到这个帖子:

Re: Can ld combine multiple object files into one?

http://www.cygwin.com/ml/cygwin/2000-01/msg00079.html

"> The Solaris ld command has an option to combine multiple object files (ie .o

> files) into one. Does the gnu ld have a similar option? The reason we want to

> do this is to hide certain information — combining multiple object files using

> ar will not do.

>

See ld documentation for relocatable link — it’s the same ‘-r’ option for

C code, but you need to use ‘-Ur’ for C++ code so that global constructors and destructors are handled properly.“

说的很清楚了,就是说,用ld,可以实现这个目的,不过要注意的是,对于C 代码的,要加参数-r表示生成的是

可重新定位的目标文件(我的理解是,否则就应该是可执行文件了):

“ -r, -i, –relocatable Generate relocatable output”

而C++代码,还要用-Ur,表示要建立全局构造函数表和析构函数表:

“ -Ur Build global constructor/destructor tables”

此处,试了试:

arm-linux-ld -r -o bch_4_s_noRomTable.obj bch_dec.o bch_gf.o bch_lut.o bch_enc4t.o bch_dec4t.o

就可以正常生成我所需要的单个目标文件/库文件了:

归根到底,还是对底层的这些编译链接等工具不熟悉,否则,就不会浪费这么长时间去搞明白这个简单的问题了:

[举例]

其中-o 表示述输出文件

另外,对于上面的,多个c文件和多个.S汇编文件,为何用arm-linux-gcc不能同时一起编译,具体原因,

希望知道的,帮忙解释一下,到现在为止,还是不知道其原因呢。。。

 

【后记】

将之前的汇编文件的.S后缀变为.s即可用arm-linux-gcc -combine -o outputFile.obj -c file1.c file2.c … file1.s file2.s …

但是,成功编译出来一个outputFile.obj后,用于其他环境,结果却会出错。

现象是,其中有些函数找不到,而这些函数,很明显地,是通过对应的宏去控制的是否编译的

而且的确是可以正常编译的,不知为何-combine这样的方式一次性地将C文件和s汇编文件,一起编译,却没有将对应函数和变量编译进去,很是奇怪

而单独地去编译这些文件,再通过ld将这些obj汇合到一起,却又可以正常使用了。真是怪事。。。后来发现,好像

arm-linux-gcc -combine -march=armv5te -o as3536_linux_bch_eabi_noRomTbl.obj -c bch_dec.c bch_gf.c bch_lut.c bch_enc4t.s bch_dec4t.s

实际只相当于

arm-linux-gcc -combine -march=armv5te -o as3536_linux_bch_eabi_noRomTbl.obj -c bch_enc4t.s bch_dec4t.s

[crifan@linux-41lh bch]$arm-linux-gcc -combine -march=armv5te -o as3536_linux_bch_eabi_all.obj -c bch_dec.c bch_gf.c bch_lut.c bch_enc4t.s bch_dec4t.s
[crifan@linux-41lh bch]$ls -lh
total 520K
。。。
-rw-r--r-- 1 crifan develop 2.5K 2010-06-08 13:13 as3536_linux_bch_eabi_all.obj
-rw-r--r-- 1 crifan develop 2.5K 2010-06-08 13:12 as3536_linux_bch_eabi_noRomTbl.obj
。。。
[crifan@linux-41lh bch]$arm-linux-objdump -t as3536_linux_bch_eabi_all.obj

as3536_linux_bch_eabi_all.obj: file format elf32-littlearm

SYMBOL TABLE:
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
0000002c l .text 00000000 bchEncodeT4Loop
00000238 l .text 00000000 bchEncodeT4End
0000020c l .text 00000000 bchEncodeT4LastBytes
00000280 l .text 00000000 bchSyndromePolyT4Loop
000004bc l .text 00000000 bchDecodeT4End
00000490 l .text 00000000 bchDecodeT4LastBytes
00000000 l d .ARM.attributes 00000000 .ARM.attributes
00000000 g .text 00000000 bchEncodeT4
00000000 *UND* 00000000 LUT4
00000258 g .text 00000000 bchSyndromePolyT4

[crifan@linux-41lh bch]$arm-linux-gcc -combine -march=armv5te -o as3536_linux_bch_eabi_noRomTbl.obj -c bch_enc4t.s bch_dec4t.s
[crifan@linux-41lh bch]$ls -lh
total 516K
。。。
-rw-r--r-- 1 crifan develop 2.5K 2010-06-08 13:12 as3536_linux_bch_eabi_noRomTbl.obj
。。。
[crifan@linux-41lh bch]$arm-linux-objdump -t as3536_linux_bch_eabi_noRomTbl.obj

as3536_linux_bch_eabi_noRomTbl.obj: file format elf32-littlearm

SYMBOL TABLE:
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
0000002c l .text 00000000 bchEncodeT4Loop
00000238 l .text 00000000 bchEncodeT4End
0000020c l .text 00000000 bchEncodeT4LastBytes
00000280 l .text 00000000 bchSyndromePolyT4Loop
000004bc l .text 00000000 bchDecodeT4End
00000490 l .text 00000000 bchDecodeT4LastBytes
00000000 l d .ARM.attributes 00000000 .ARM.attributes
00000000 g .text 00000000 bchEncodeT4
00000000 *UND* 00000000 LUT4
00000258 g .text 00000000 bchSyndromePolyT4

后来经过尝试,直接这么操作即可:

arm-linux-gcc -combine -mabi=aapcs-linux -mfloat-abi=soft -march=armv5te -o bch_eabi_asm.obj -c bch_enc4t.s bch_dec4t.s
arm-linux-gcc -combine -mabi=aapcs-linux -mfloat-abi=soft -march=armv5te -o bch_eabi_cCode.obj -c bch_dec.c bch_gf.c bch_lut.c
arm-linux-ld -r -o bch_as353x_linux.objs bch_eabi_asm.obj bch_eabi_cCode.obj

转载请注明:在路上 » 【已解决】给定多个C文件和多个.S汇编文件,如何用他们生成单个.o目标文件

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.179 seconds, using 22.11MB memory