2012-07-28 5 views
0

나는 잠시 동안 구글에서 열매 맺은 결과를 보지 못했다. 나는 실제로 수출 방법을 찾고있다. 또는 어떤 방법으로 모든 문자열 리터럴의 목록을 얻는가?GCC에서 문자열 리터럴을 가져 오는 방법이 있습니까?

int main(){ 
    const char *p = "Hello"; 
    const char x[] = "World"; 
} 

이 코드를 컴파일하는 데 "Hello"와 "World"를 알 수있는 방법이 있습니까? 나는 그들이 디스어셈블러 (Windows에서 일부 사용)에서 사용할 수 있다는 것을 알고 있습니다. 하지만 실제로 이러한 문자열을 덤프하거나 어떻게 든 그들을 내보낼 수있는 몇 가지 적절한 도구가 무엇입니까?

+1

질문을 명확하게 할 수 있습니까? – Rndm

+1

왜 정확히하고 싶습니까? '__FILE__' 또는'__func__'의 문자열은 어떻게됩니까? –

답변

-1

문자열과 주석을 인식하고 다른 모든 것을 무시하는 간단한 토크 나이저를 작성하십시오.

+0

나는 헤더 파일과 다른 것들을 포함하기 때문에 단지 복잡성 만 증가시킬 것입니다. – MaX

+1

프리 프로세서 출력에 사용합니다. – perreal

+1

누군가가이 작업을 수행 했음에 틀림 없다고 생각합니다. 왜 그런 덩어리가 나고 재 방법을 사용합니까? – MaX

1

디버그 정보가 없으면 단지 읽기 전용 데이터 영역 (아마도 .rdata 섹션, IIRC)으로 그려지는 것을 알 수 있습니다.

linux strings 유틸리티는 바이너리 파일을보고 지정된 길이와 인코딩 제약 조건 내에서 인식 된 문자열을 덤프합니다.

+0

문자열은 다른 정크를 많이 인쇄하므로별로 유용하지 않습니다. 소스 코드를 줘서 디버그 모드로 컴파일 할 수 있습니까? 최종 컴파일 파일 대신 .o 파일을 사용하는 것이 더 합리적이라고 생각합니다. – MaX

+2

현재 적절한 플랫폼에 대한 액세스 권한이 없습니다. 하지만 나는''-g' (http://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/Debugging-Options.html)로 컴파일하고 실행 파일을 살펴 본다면 'readelf -a'를 사용하면 이러한 변수에 대해 더 많은 통찰력을 얻을 수 있습니다. 적어도 당신은 문자열에 당신을 (문자 그대로) 가리킬 주소를 얻을 수 있어야합니다. –

+0

Mac에서'''gobjdump''가 더 이상 도움이되지 않습니까? – MaX

0

왜 C 코드에서 정확히 모든 문자열 리터럴 상수가 필요합니까? 바이너리에서 strings 유틸리티를 사용하는 것으로 충분할 수 있습니다.

예를 들어 GCC 컴파일러를 사용자 정의 할 수 있습니다. 그 목적을 위해 MELT으로, 그러나 그것은 당신에게 며칠이 걸릴 수 있고 나는 그것이 과잉이라고 느낍니다.

또한 GCC에서 어셈블리 코드를 내보내고 해당 어셈블리 코드를 문자열 상수로 구문 분석 할 수 있습니다.

물론 사전 처리 된 양식을 토큰 화하고 구문 분석 할 수 있습니다.

+0

OP는 C 문자열을 인식하고 침을 뱉기 위해 짧은 프로그램 (Perl에서는 사소한 것)을 작성하는 데 소요되는 최소한의 시간을 보내고 싶지 않습니다. –

2

나는 완전히 질문하지 않습니다. 당신은 소스 파일을 가지고 있으며 컴파일 할 때 얼마나 많은 문자열 상수를 사용했는지 GCC가 필요합니다. 이걸 해석하는 것이 옳은가요?

그렇다면 "gcc -S source_file"을 사용하여 gcc에 컴파일하도록 말할 수 있습니다. 이렇게하면 ".string"에 대해 정의한 문자열 상수가 들어있는 .s 파일이 제공됩니다. ".string"발생에 대해이 파일을 구문 분석하고 개수를 가져옵니다 (수동 또는 "wc -l"에 파이프 된 "grep"포함)

관련 문제