我有一個項目,我正在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
。如我所料,_sysInit
從0x60010000
開始。