본문 바로가기
WORK/Sotfware

[C language] __attribute__((weak)) usage

by KANG Stroy 2023. 6. 16.
728x90
728x90

한 참을 고민하다고, 자료를 모으고 검색을 해서 확인을 했습니다. 

 

간단하게 예제를 만들어서 확인을 하겠습니다. 자세한 설명은 아래의 링크를 참고해 주세요. 

간단하게 설명 하자면? 

똑같은 이름의 함수를 2개를 쓰게 되었습니다. 과연 어떤 함수를 사용 해야 할까? 입니다. 

 

왜? 똑같은 이름의 함수를 사용하지? 이유는? 

인터럽트 부분에서 많이 사용되는 부분 입니다. 미리 지정이 되어 있는 함수들이 있습니다. 그런데 막상 그 함수로 들어가면 사용자가 프로그램을 해야 합니다. 미리 만들어져 있는 함수는 그냥 두고 내가 편한곳에서 함수를 만들고 싶은 충동일 발생하게 됩니다. ( 안 생길수도 있지만, 생긴다고 생각하면서.. ) 

 

그때 동일한 함수를 다른곳에 쓰고 원래 있는 함수는 껍데기로 만들어 버리는거죠. 그러다 막상 필요가 없어지면 새로 만든 함수만을 삭제하면, 에러가 발생되지 않습니다. 사전에 지정된 함수를 weak ( 약하게 ) 새로 만든 함수를 strong ( 강하게 ) 만드는 구조를 생각해 낸 것입니다. 

 

다시 똑같은 말을 살짝 비틀어서.. 

제조사에서 만들어서 배포하는 껍데기 함수를 삭제하지 않고

내가 원하는 위치에 껍데기 안을 채워넣기 위함입니다. 

 

속성 변경이라는 말로 할 수도 있지만, 주 사용 목적을 생각하면서 아래 사이트를 다시 한번 참고 하시는것도 좋겠내요. 

 

예를 든다면? function_a.c 에는 아무 기능이 없는 함수 입니다. 

// 이전에 미리 만들어 둔 함수는 function_a.c
// 아무 기능이 없습니다. 
__attribute__((weak)) char *f_get_discovered_list(char *text, void *pbss, int val)
{
    return 0;
};

그런데 main.c 에 원하는 기능을 넣고 싶은 충동이 갑자기 생긴겁니다. 

// main.c 에 함수를 똑같은 이름의 함수를 만들었습니다. 
char *f_get_discovered_list(char *text, void *pbss, int val)
{
	printf("main_f_get_discovered_list\r\n");
    return 0;
};

이때 main에서는 어떤 함수를 가져 올까요? 

바로 printf가 들어간 함수를 호출하게 되는거죠.. 위에 함수는 약한함수.. 아래 함수는 강한 함수..입니다. 

테스트를 하기 위해서 두 곳에 모두 print를 넣어서 테스트 하시면, 동작이 머릿속에 쏙 들어 올 것입니다.  

 

https://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Attribute-Syntax.html#Attribute-Syntax 

 

Attribute Syntax - Using the GNU Compiler Collection (GCC)

 

gcc.gnu.org

https://engineering-agit.tistory.com/25

 

[Embedded engineering study 02] - Weak function

◈ 여는 글 Interrupt에 관한 프로그래밍을 하다 startup code에 다음과 같이 적혀있는 함수들을 본 적이 있을 것이다. . . . //Weak Function Deffinitions, can be written / declared in other files extern void SVC_Handler(void)

engineering-agit.tistory.com

https://damduc.tistory.com/338

 

심볼에 대한 고찰

모든 재배치 가능한 오브젝트 파일들은 심볼 테이블과 그와 관련된 심볼들을 가지고 있다. 링커의 관점에서 볼 때 심볼들은 다음과 같이 분류할 수 있다. - 현재의 파일에서 정의되고, 다른 파일

damduc.tistory.com

728x90

댓글