2016-09-13 18 views
3

, 우리는 컴파일 할 때, 예를 들어 아래의 코드 조각 :Windows gcc (cygwin)가 ELF 헤더를 쓰지 않는 이유는 무엇입니까? 리눅스 머신에서

b.cc : 명령과

typedef struct sTeste { 
    int campo1; 
    char campo2; 
    int campo3; 


} T_TESTE; 


void m1(T_TESTE *p) { 

} 

:

GCC -gdwarf-2 파라메터 - C b.cc -o 보

우리는 ELF 헤더를 얻을

 
[email protected]:~# hd b.o |head 
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............| 
00000020 00 00 00 00 00 00 00 00 a8 03 00 00 00 00 00 00 |................| 
00000030 00 00 00 00 40 00 00 00 00 00 40 00 14 00 11 00 |[email protected]@.....| 
00000040 55 48 89 e5 48 89 7d f8 5d c3 00 00 b1 00 00 00 |UH..H.}.].......| 
00000050 02 00 00 00 00 00 08 01 00 00 00 00 04 00 00 00 |................| 
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000070 00 00 00 00 00 00 00 00 00 02 00 00 00 00 0c 01 |................| 
00000080 01 64 00 00 00 03 00 00 00 00 01 02 64 00 00 00 |.d..........d...| 
00000090 02 23 00 03 00 00 00 00 01 03 6b 00 00 00 02 23 |.#........k....#| 

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |. ELF ............ | 우리는 Windows에서 동일한 작업을 수행 할 때

그러나, 결과는 다음과 같습니다

 
C:\Aleks-IOT\Code\Dev\JAVA\nbdwarfdumplib>xxd b.o |head 
00000000: 6486 0d00 0000 0000 ae05 0000 1c00 0000 d............... 
00000010: 0000 0400 2e74 6578 7400 0000 0000 0000 .....text....... 
00000020: 0000 0000 1000 0000 1c02 0000 0000 0000 ................ 
00000030: 0000 0000 0000 0000 2000 5060 2e64 6174 ........ .P`.dat 
00000040: 6100 0000 0000 0000 0000 0000 0000 0000 a............... 

내 진짜 문제는 내가이 만 간단한 컴파일 단위 (b.cc에서 난쟁이 디버그 데이터를 추출하고자하는 것입니다 케이스).

실마리가 있습니까?

감사

+0

Windows 10 64 비트가 있습니까? [Windows 우분투] (https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)를 사용하면 Windows cmd 또는 powershell 창에서 ELF 바이너리를 빌드하고 실행할 수 있습니다. 미리보기 품질입니다. BSOD를'apt-get'을 사용해서 얻었습니다. –

+0

시도해 보겠습니다. –

답변

1

내가 사용중인 버전을 잘 모릅니다. GCC 표준 (C 컴파일) - - GCC-ELF 너무 윈도우에서

(엘프와 C를 컴파일)하지만 가지고 엘프

4

Windows를 사용하지 않기 때문에 더 어렵습니다 : 리눅스에서 GCC가 될 수 있습니다 꼬마 요정. Windows는 PE (https://en.wikipedia.org/wiki/Portable_Executable)를 사용합니다. Windows에서 ELF를 원한다면 GCC 소스를 얻고 ./configure 단계에서 ELF 타겟으로 직접 빌드하십시오.

그러나 Windows에서는 출력을 실행할 수 없습니다.

PE에서는 디버그 정보가 기호로 COFF 기호 테이블에 저장됩니다. 당신은 윈도우 API를 통해 얻을 수 있습니다 : 당신은 PE 파일에 엿볼 수 있도록 그것을 사용하는 무료 도구의 무리가있다

https://msdn.microsoft.com/en-us/library/ms809762.aspx

. 예 : https://sourceforge.net/projects/nktspeview/

+0

예,하지만 실행 파일이 생성되지 않은 상태에서 왜소한 데이터를 창에서 가져올 수 없었습니다. 고맙습니다. dwarfdump가 Linux에서 완벽하게 작동합니다! 단지 소스에 PE를 사용하는 방법을 알고 있습니까? –

+0

몇 가지 세부 정보를 추가했습니다. PE 파일 뷰어에 대한 웹 검색을 원할 수 있습니다. 나는 어느 것이 최선인지 모른다. 이 분야에서 일한 이후 오랜 시간이 걸렸습니다. – thang

+0

PE 형식을 사용하고 싶지 않습니다. 왜냐하면이 형식은 Windows 환경에만 있고 응용 프로그램은 Linux와 MAcOS에서 실행되어야하기 때문입니다. 하지만 elf를 얻으려면 gcc를 생성하는 방법에 대해 이야기했습니다. 그게 좋은 생각이고 나는 시도 할거야. –