Chinaunix首页 | 论坛 | 博客
  • 博客访问: 571805
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-20 23:31:54

问题:当使用gnu编译器,image大小超过32M时,链接时调用vxWorks的函数会触发长调用错误。增加-mlongcall会增加二进制文件的大小,并且会一定程度的降低效率。希望通过调整各个模块链接的顺序,把vxWorks的库放到中间,这样可以在一定程度内避免长调用问题。
 
在$(installdir)\vxworks-6.4\target\h\make\rules.vxWorks中,有编译脚本语句,大概在142行,附在了本文的后面。红色部分是使用工程方式编译要走到的分支,其中$(LD_EXTRA_MODULES_LIST)对应的编译输出是prjExtraModules.lst,既用户自己的库文件和obj文件,可以调整一下顺序,把它放到$(LD_LINK_PATH) $(COMP_LIBS) $(LIBS)与$(LD_PARTIAL_END_GROUP)之间。prjObjs.lst既bsp部分不要换位置,这个lst中的内容跟usrEntry绑定,涉及到整个image的入口。

rules.vxWorks 的内容:
ifeq ($(SRC_BUILD), TRUE)
$(warning building vxWorks from source)

COMP_OBJ_LIST = $(OPTION_PASS_TO_LD)$(OPTION_INDIRECT_FILE)$(PRJ_FULL_PATH)/compObjs.lst

CC_LIB += $(CC_LIBINTRINSICS)

partialImage.o: version.o usrEntry.o $(PRJ_FULL_PATH)/compObjs.lst src_build $(PRJ_OBJS_FILE) \
$(PRJ_OBJS) $(EXTRA_MODULES)
$(RM_EXTRA_MODULES_LIST)
$(CREATE_EXTRA_MODULES_LIST)
$(LD_PARTIAL) usrEntry.o $(PRJ_OBJS_FOR_LD_PARTIAL) $(COMP_OBJ_LIST) \
  $(LD_EXTRA_MODULES_LIST) version.o $(LD_PARTIAL_START_GROUP) \
  $(LD_LINK_PATH) -L $(PRJ_FULL_PATH) $(COMP_LIBS) \
  $(LD_PARTIAL_END_GROUP) $(CC_LIB) -o $@ $(MAPCMD)

else
partialImage.o: $(LDDEPS) $(PRJ_OBJS) $(EXTRA_MODULES) \
        $(patsubst -l%,lib%.a,$(COMP_LIBS)) \
$(patsubst -l%,lib%.a,$(LIBS)) $(CC_LIB) $(PRJ_OBJS_FILE) version.o usrEntry.o
$(RM_EXTRA_MODULES_LIST)
$(CREATE_EXTRA_MODULES_LIST)
- @ $(RM) $@
ifneq   ($(findstring vxWorks_rom, $(DEFAULT_RULE)),)
$(LD_PARTIAL) usrEntry.o $(PRJ_OBJS_FOR_LD_PARTIAL) \
  $(LD_EXTRA_MODULES_LIST) version.o \
   $(LD_PARTIAL_START_GROUP) \
  $(LD_LINK_PATH) $(COMP_LIBS) $(LIBS) \
  $(LD_PARTIAL_END_GROUP)  $(CC_LIB) -o $@ $(MAPCMD)
else
$(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(LD_EXTRA_MODULES_LIST) \
  version.o $(LD_PARTIAL_START_GROUP) \
  $(LD_LINK_PATH) $(COMP_LIBS) $(LIBS) $(LD_PARTIAL_END_GROUP) $(CC_LIB) -o $@ $(MAPCMD)

endif
endif
ifeq ($(REMOVE_DEADWEIGHT),TRUE)
$(TRIM_TOOL) $@ $@_trim
$(MV) $@_trim $@
endif


例子(把一部分obj文件从prjObj.lst中拆出来放到myObj.lst中):
$(LD_PARTIAL) -Wl,@../bspObj.lst  \
  version.o $(LD_PARTIAL_START_GROUP) \
  $(LD_LINK_PATH) $(COMP_LIBS) $(LIBS) -Wl,@../myObj.lst $(LD_PARTIAL_END_GROUP) $(CC_LIB) -o $@ $(MAPCMD)
阅读(1758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~