2011-08-03 10 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 ${@} 

경우 (플래그 & 등) 알려주세요. 나는 그 컴퓨터에 지금은 아니지만, 약 1 시간 후에 그 때까지 아무런 대답도 없을 경우이 질문을 더 자세하게 업데이트 할 것입니다.

다음은 링커 스크립트의 대략적인 스케치입니다. 어떤 전에 아무것도 포함되기 전에 wrs_kernel_text_start 텍스트 세그먼트의 시작 부분에 발생한다는 사실을

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 */ 
} 

를 적어 둡니다과 : 당신이 Vx 웍스 6.x에서에 액세스 할 수있는 경우, 그것은 단지 기본 'link.RAM'스크립트입니다 ALIGN 문.

완료 한 다른 vxWorks 프로젝트에서 wrs_kernel_text_start = 0x60010000; 그러나이 특정 프로젝트에서는 대략 0x6025XXXX과 비슷한 수준입니다. 당신은 틀린 것을 읽지 않고 있습니다, 그 주소는 내가 기대하는 주소보다 1 자릿수 높습니다. 즉, 0x60025XXX이 아닙니다. _sysInit은 내가 예상 한대로 0x60010000에서 바로 시작합니다.

답변

0

나는이 질문을 삭제할 예정 이었지만, 누군가가 대답에서 어떤 가치를 얻을 것이라고 생각합니다. 링커 스크립트 종속성 목록에 있었던

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

참고, 나는 입력 파일의 하나로서 ${^}으로 포함되었다 : makefile은 실제로처럼 보였다. 종속성 목록에서 링커 스크립트를 제거하면 모든 것이 정상적으로 보입니다.