2012-01-13 3 views
0

편집 : 완전히 원래의 질문에 대해 완전히 바꿔서 말하고 있습니다 (명확하지 않은 부분은 하단에서 볼 수 있습니다!).디버깅 정보의 이름을 바꾸는 방법은 무엇입니까?

커널과 응용 프로그램 모두가 메모리의 특정 위치에 매핑되어야하는 RTOS를 개발 중입니다. 예 :

0x00000000:0x0000ffff: application #1 
0x00010000:0x0000ffff: application #2 
... 
0xffff0000:0xffffffff: kernel 

응용 프로그램 (및 커널)은 별도로 개발 (및 컴파일)됩니다. 모든 것을 하나의 실행 파일에 병합하려면 다음 프로세스가 사용됩니다.

  1. (별도) 커널과 응용 프로그램을 컴파일 (기호는 제외)합니다.
  2. (스크립트를 통해) 링커 스크립트를 생성하여 커널과 응용 프로그램을 원하는 위치로 재배치하십시오. 섹션 이름 간의 충돌을 막기 위해 생성 된 링커 스크립트는 모든 애플리케이션의 모든 섹션을 "이름을 변경"합니다 (예 : .app1.text, .app1.data, .app1.bss, ...).
  3. 이전에 생성 된 링커 스크립트를 사용하여 링크합니다 (예 : 모두 병합).

질문 1) 2 단계와 3 단계를 다음 프로세스로 대체 할 수 있습니까?

  1. 커널과 응용 프로그램의 개체 파일을 원하는 위치로 재배치하십시오.
  2. 이름 충돌을 방지하기 위해 응용 프로그램의 개체 파일에있는 모든 기호의 이름을 바꿉니다.
  3. 모두 병합하십시오.

저는 이미 사용 가능한 도구로 링커 스크립트를 대체하려고합니다.

단계 1은 위치 독립적 실행 파일을 만들 수 있어야합니다 (아직 조사해야합니다).

단계 # 2는 GNU objcopy까지 가능합니다.

3 단계의 경우 아직 해결 방법이 없습니다. GNU ld이 사용되면 일부 기본 링커 스크립트가 사용되며 이전 재배치는 손실됩니다. GNU gdb 허용되는 보관 파일이 에서 생성 된 경우 GNU ar 문제가 해결 될 것입니다 (제 생각 엔!).

질문 2) 위의 프로세스가 가능하면 디버깅 정보에도 적용 할 수 있습니까?

1 단계는 손상되지 않아야합니다.

2 단계에서 디버깅 정보의 이름이 바뀌 었는지 확실하지 않습니다.

3 단계의 문제가 남아 있습니다.

원래 질문은 다음과 같습니다 : I 사용자 정의 커널과 응용 프로그램을 하나 이상 가지고 있고, 나는 전체 시스템을 디버깅 GDB를 사용하고자

.어떤 이름 충돌을 피하기 위해서 연결 도중 을 objcopy를 사용하여 모든 섹션과 기호의 이름을 (응용 프로그램의 시작 주소는 커널에 하드 코딩 됨)으로 바꿉니다. 그러나 디버깅 정보는 해당 섹션의 .debug. * 섹션에 하드 코딩되어 있으므로 이름이 변경되지 않습니다.

디버깅 정보의 이름을 바꿀 수있는 방법이 있습니까? 그리고, 그 후, 정보를 이미 존재하는 다른 디버깅 세트와 병합 정보가 있습니까?

GCC의 매뉴얼을 검색하여 컴파일 중 심볼 (글로벌 네임 스페이스와 같은) 앞에 모든 심볼을 접두어로 붙일 수있는 옵션을 찾을 수 있는지 확인했습니다. 그러나 은 찾지 못했습니다.

내 생각 엔 이름을 바꿀 수있는 객체 기호 테이블에 대한 정보를 표시하는 디버깅 형식이 있다고 생각합니다.

+0

귀하의 질문은 명확하지 않습니다. "응용 프로그램의 시작 주소는 하드 코딩되어 있습니다"라는 것은 무엇을 의미합니까? 커널이나 사용자 수준 프로그램의 일부분입니다. 또한, 어떤 섹션을 무엇으로 이름을 바꿉니 까? 예 : '.debug_lines'를 다른 것으로 변환 시키면 GDB가 처리 할 수있는 것을 생성하지 않을 것입니다. –

+0

"응용 프로그램의 시작 주소가 하드 코드 됨"이란 말은 커널이 "사용자 수준"응용 프로그램을 시작하기 위해 명명 규칙에 의존하지 않는다는 의미입니다. 따라서 기호 테이블의 항목은 자유롭게 이름을 바꿀 수 있습니다. –

+0

죄송합니다. 아직 * 어떤 * 의미가 없습니다 (나에게). 아마도 다른 누군가가 더 나은 행운을 누릴 수 있습니다. 그 동안 위의 설명을 삭제하고 해당 정보를 질문으로 이동하십시오. –

답변

0

답변 (I 아직도)이 조사해야

1 단계는 위치 독립 실행 파일의 생성을 가능해야한다) 질문 1.

아니요, 불가능합니다. 위치 독립 실행 파일은 실행 파일의로드 주소가로드 시간에만 알려질 때 유용합니다. 제 경우에는로드 주소를 고정시키고 싶습니다.

3 단계에서 나는 아직 가능한 해결책이 없습니다. GNU ld를 사용하면 은 일부 기본 링커 스크립트를 사용하고 이전 재배치는 손실됩니다. GNU gdb가 GNU ar에서 생성 된 아카이브를 허용했다면, 문제는 으로 해결 될 것입니다 (아마도!).

해결 방법이없는 것 같습니다. 따라서 링커 스크립트는 필수 항목입니다.

답변 디버깅 정보는 이름을 바꾸거나 하지되면 어떻게이 확실하지 않다) 단계 # 2의

이 질문합니다.

실제로 디버깅 정보의 이름이 변경되지 않습니다. objdump -s을 사용하고 디버깅 정보가 .debug. * 섹션 내부에 고정 배선되어 있는지 확인할 수 있습니다.

해결)

심지어 정보는 중단 점을 설정하는 오브젝트 파일의 심볼 테이블을 사용할 수 있습니다 디버깅하지 않고. 그러나 b 주 symtable의 기호가 주소로 해석되므로 b * 주을 사용해야합니다. 이것은별로 아니지만 확실히 도움이됩니다.

관련 문제