zyp568 发表于 2012-8-9 07:24:01

请教一下vsprintf

本帖最后由 zyp568 于 2012-8-9 19:51 编辑

写的裸奔程序中,用到vsprintf()函数,无法链接成功。
最初是使用vfprintf()函数的,编译链接都没问题,可是代码过大(768MB),gg以后得知,不是向文件输出的话,应该使用vsprintf(),但是替换函数后,链接出错了。
请教一下是什么问题呐?
我想可能是vsprintf()需要的什么库没有链接进来吧,但是不知道是哪个库。

Makefile如下:
objs1:= output/Head.o output/Init.o output/MMU.o output/Nand_K9F2G08U0B.o output/Interrupt.o
objs2:= output/Test.o output/TFTLCD.o output/Common.o output/UART.o
objs := $(objs1) $(objs2)

lib1 := /home/long/gcc-3.4.5-glibc-2.3.6/lib/gcc/arm-linux/3.4.5/
lib2 := /home/long/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/

Test.bin : $(objs)
            arm-linux-ld -TTest.lds -L$(lib1) -o output/Test.elf $^ $(lib2)libc.a -lgcc
            arm-linux-objcopy -O binary -S output/Test.elf $@
            arm-linux-objdump -D -m arm output/Test.elf > output/Test.dis

output/%.o : source/%.c
            arm-linux-gcc -Wall -O2 -c -o $@ $<

output/%.o : source/%.s
            arm-linux-gcc -Wall -O2 -c -o $@ $<

clean:
            rm -f output/Test.elf output/Test.dis output/*.o Test.bin

函数代码如下:
void UART_Printf( unsigned int iUARTID, const char *pFmt, ... )
{
         S32 i;
         S8 UART_TxBuffer;
         va_list ap;

         va_start( ap, pFmt );
         vsprintf( UART_TxBuffer, pFmt, ap );
         va_end( ap );

         for( i = 0 ; UART_TxBuffer != '\0' ; i++ )
                      UART_PutChar( iUARTID, UART_TxBuffer );
            UART_PutChar( iUARTID, '\0' );
}

错误信息如下:
arm-linux-ld: section __libc_atexit overlaps section second
arm-linux-ld: section .rodata overlaps section second
arm-linux-ld: section .rodata.str1.4 overlaps section second
arm-linux-ld: section __libc_subfreeres overlaps section second
arm-linux-ld: section .gnu.linkonce.r.__strtol_ul_max_tab overlaps section second
arm-linux-ld: section .gnu.linkonce.r.__strtol_ul_rem_tab overlaps section second
arm-linux-ld: section .rodata.str4.4 overlaps section second
arm-linux-ld: section .gnu.linkonce.r.__strtol_ull_max_tab overlaps section second
arm-linux-ld: section .gnu.linkonce.r.__strtol_ull_rem_tab overlaps section second
make: *** Error 1

raominping 发表于 2012-8-9 15:01:29

兄弟,这个版块不跑系统的额。你到linux内核区去问问吧?

zyp568 发表于 2012-8-9 16:35:28

raominping 发表于 2012-8-9 15:01 static/image/common/back.gif
兄弟,这个版块不跑系统的额。你到linux内核区去问问吧?

汗,我这个是裸奔代码呢。

raominping 发表于 2012-8-9 18:40:17

zyp568 发表于 2012-8-9 16:35 static/image/common/back.gif
汗,我这个是裸奔代码呢。

怎么用到交叉编译器了?

zyp568 发表于 2012-8-9 19:48:00

raominping 发表于 2012-8-9 18:40 static/image/common/back.gif
怎么用到交叉编译器了?

在Ubuntu上编译,然后下载到板子上试验的。

raominping 发表于 2012-8-10 21:04:48

zyp568 发表于 2012-8-9 19:48 static/image/common/back.gif
在Ubuntu上编译,然后下载到板子上试验的。

这个我没试过,不知道行不行,我都在window下弄的。

zyp568 发表于 2012-8-13 17:04:09

raominping 发表于 2012-8-10 21:04 static/image/common/back.gif
这个我没试过,不知道行不行,我都在window下弄的。

哦,ADS我没用过,回头到Keil下试试。
用ubuntu主要是想对代码有个全面的了解。Keil会自动生成一些“补丁”代码,ADS就不知道了。

happain 发表于 2013-1-8 09:31:16

lz你的问题我遇到过,我参考国外大神的指点了,第一arm-linux-gcc环境下,有些库函数是不能调用的,比如vsprintf就不能调用,所以即使是你添加了那个头文件,还是编译不过的,最主要的原因就是这些函数是操作系统层面的,再裸机中不能调用,要像调用,参考UBOOT,uboot里面所有的函数都是自己编写,不调用,这久大大加大了uboot的可移植性
页: [1]
查看完整版本: 请教一下vsprintf