2011-08-03 64 views
1

我有一個項目,我正在vxWorks中構建一個用於測試的vxsim二進制文件。鏈接過程有三個階段;生成文件的相關部分大致如下如下:(vxworks)在使用此鏈接描述文件生成的二進制文件中,爲什麼遇到的第一個地址不是從文本段起始地址開始的?

partialImage.o: ${SYSTEM_OBJS} ${OBJS} version.o 
    ldsparc ${appropriate LDFLAGS go here} ${^} -o ${@} 

# Don't ask me why they did it this way; it seems redundant to re-use 
# all the other objects as well as partialImage.o, but I'm also not extremely 
# versed in what's necessary for munch.tcl to do its thing. 
ctdt.o: partialImage.o ${SYSTEM_OBJS} ${OBJS} version.o 
    ${VXSIMNM} ${^} | tclsh ${path to munch.tcl} > ${@:%.o=%.c} 
    ccsparc ${appropriate CFLAGS go here} ${@:%.o=%.c} -o ${@} 

${FINAL_IMAGE}: ${a list of dependencies here} 
    ldsparc -N -e _sysInit -Ttext 60010000 \ 
     ${appropriately ordered list of objects} \ 
     -defsym _VX_DATA_ALIGN=16 \ 
     -T link.RAM \ 
     -o ${@} 

如果需要更多的信息(標誌&等)讓我知道。我目前沒有在那臺計算機上,但是如果在那個時候沒有答案,那麼在大約一個小時內我會更新這個問題的更多細節。

以下是鏈接器腳本的粗略草圖。如果你有機會獲得VxWorks的6.x的,它只是默認的「link.RAM」腳本:

START(_sysInit) 
SECTIONS { 
    .text { 
    wrs_kernel_text_start = .; 
    /* A few other variable declarations and inclusions from various other segments */ 
    . = ALIGN(16); 
    } 
. = ALIGN(16); 
/* The rest of the linker script */ 
} 

注意到這一點wrs_kernel_text_start出現在文本段開頭的事實,包括任何東西之前與之前的任何ALIGN語句。

在我已完成的其他vxWorks項目中,wrs_kernel_text_start = 0x60010000;然而,在這個特定的項目中,它的地址大致與0x6025XXXX相同。你沒有讀錯,地址比我預期的地址高1個數量級 - 也就是說,它不是0x60025XXX。如我所料,_sysInit0x60010000開始。

回答

0

我打算刪除這個問題,但我想有人可能會從答案中獲得一些價值。生成文件本來的樣子的:

outfile: ${SYSTEM_OBJS} ${OBJS} version.o link.RAM 
    ldsparc ${appropriate LDFLAGS go here} ${^} -o ${@} 
(...) 

注意,鏈接腳本是在依賴列表中,我包括它${^}作爲輸入文件之一。當我從依賴列表中刪除鏈接器腳本時,現在一切看起來都正常。

相關問題