2017-11-19 9 views
1

I는 단지 선언 된 functiopn 있도록이죽은 코드 제거 adbout의 GCC의 -O 높은

#include <stdlib.h> 
#include <stdio.h> 

//#define CONFIG_TARGET_X86_64 

#ifdef CONFIG_TARGET_X86_64 
static void A() 
{ 
    printf("A\n"); 
} 
#else 
void A(); 
#endif 

static void B() 
{ 
    printf("B\n"); 
} 


static int xx() 
{ 
#ifdef CONFIG_TARGET_X86_64 
    return 1; 
#else 
    return 0; 
#endif 
} 

int main(void) 
{ 
    if (xx()) /* define CONFIG_TARGET_X86_64 */ 
    A(); 
    else 
    B(); 
} 

같은 간단한 코드가 우리의 CONFIG_TARGET_X86_64, xx() 항상 FALSE를 반환합니다 정의하지 않으면 작성했습니다, 구현되지 않았지만 절대로 호출되지 않습니다 (데드 코드).

는 GCC -O0

/tmp/cctSpgGk.o: In function `main': 
1.c:(.text+0x34): undefined reference to `A' 
collect2: error: ld returned 1 exit status 

로 컴파일하지만 -O1 이상으로 컴파일 할 수 있습니다.

사용 GCC의 V6.1.0은

-O1 옵션에서 최적화 옵션 중 하나가 죽은 코드를 제거 것으로 보인다

, 나는

https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/Optimize-Options.html

하지만 GCC에 대한 최적화 doccument을 보았다

그것을 찾을 수 없습니다.

그래서이 코드를 -O0 옵션으로 컴파일하고 싶습니다. 가능합니까? 일부 최적화 플래그가이 작업을 수행하는 데 도움이됩니까?

void A() { }; 

는 큰 차이가있다 :이 방법을 구현를 선언

void A(); 

: 여기에서 주목할 것은이 방법 서명을 선언 무엇 가치가

감사

+2

물론입니다. 'gcc -c your_file.c'. 올바른 'A'에 대한 정의되지 않은 공개 참조가있는 객체 파일을 정상적으로 컴파일합니다. 실행 파일을 얻으려면 참조를 수행하는 다른 오브젝트 파일과 링크해야합니다. 죽은 함수 참조를 제거하기위한 C 표준 _allows_ 최적화는 _ 필요하지만 _ 필요하지 않습니다. – Gene

+0

gcc -O1은 많은 최적화 플래그를 켜기 때문에 -O0에서 사용하려고 시도하지만 작동하지 않습니다. -O0 아래에서 코드를 컴파일하는 데 사용할 수있는 플래그가 있습니까? 감사. – gatieme

+0

이 코드를'-O0'으로 컴파일하고 정의되고 정의되지 않은'CONFIG_TARGET_X86_64'로 컴파일하는 방법은 있지만 코드를 편집하지 않고 깨끗한 코드, 읽을 수있는 코드, 이식 가능한 코드, 올바른 코드 또는 유지 보수 가능한 코드에 대해 신경 쓰지 않아도 될까요? 나는. 너는 다른 질문에 downtonotes의 톤을 가치가있을 총계로 무서운 계획안에 흥미 있는가? – Yunnosch

답변

1

이 둘 사이.

호출이있는 함수를 참조하는 경우 호출을 구현해야합니다. 컴파일러는 다른 요소에 따라 해당 함수 호출을 최적화할지 여부를 결정하지만 함수가 무엇인지 알 수 없으므로 이 수행하는 대상을 알아야합니다..

void A (void) __attribute__ ((weak)); 

그런 다음 링커는 정의되지 않은 기호 참조를 무시하지만,이 함수를 호출은 충돌로 이어질 것입니다 :

+0

의도적으로했는데, -O0에서 컴파일 할 수는 없지만 -O1 이상에서는 최적화 할 수 있습니다. – gatieme

+0

전혀 구현하지 않고 컴파일하는 방법을 모르겠습니다. 당신의 컴파일러가'A()'가 무엇을하는지 짐작하기로되어 있습니까? 어쩌면 하나의 브랜치가 실행되지 않아 콜을 제거하고 운이 좋으면 옵티마이 저가 항상 존재하는 문제를 무시합니다. 이 코드는'A()'를 구현하지 않으면 유효하지 않습니다. – tadman

+0

gcc v6.1.0을 사용하면 컴파일러는 함수를 추측하지 않지만 코드가 죽었다는 것을 알 수 있습니다. – gatieme

0

당신은 A이 약한 선언 할 수 있습니다.