>  기사  >  백엔드 개발  >  C DLL에서 내보낸 함수 이름을 제어하는 ​​방법: 장식된 것과 장식되지 않은 것?

C DLL에서 내보낸 함수 이름을 제어하는 ​​방법: 장식된 것과 장식되지 않은 것?

Patricia Arquette
Patricia Arquette원래의
2024-11-17 01:32:03657검색

How to Control Exported Function Names in C   DLLs: Decorated vs. Undecorated?

C DLL 내보내기: 장식된 이름과 장식되지 않은 이름

C DLL에서 함수를 내보낼 때 장식된(잘못된) 이름이 나타날 수 있습니다. 이 동작은 C에서 기호 이름을 확인하기 위한 컴파일러의 이름 조작 메커니즘에서 발생합니다.

모듈 정의 파일(.def)

모듈 정의 파일을 사용할 때 내보낸 함수의 이름을 명시적으로 지정합니다. 그러나 컴파일러는 내보낸 기호 이름에 장식된 접미사를 계속 추가합니다. 이는 함수의 인수, 반환 유형 및 기타 세부 정보에 대한 정보를 포함하는 함수 이름의 잘못된 버전입니다.

extern "C" Import

함수 내보내기 "extern "C"" 구문을 사용하면 컴파일러가 함수 이름을 이름 변경하는 것을 방지할 수 있습니다. 그러나 "="다음의 추가 접미사는 제거되지 않습니다.

Pragma Comment

함수를 명시적으로 내보내는 또 다른 접근 방식은 #pragma comment 링커를 사용하는 것입니다. 지령. 이 지시어를 사용하면 내보낼 장식된 함수 이름을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

이 지시어는 제공된 데코레이팅된 이름으로 "SomeFunction" 함수를 내보내도록 링커에 지시합니다.

FUNCTION 매크로

또 다른 옵션은 함수 본문 내에서 FUNCTION 매크로를 사용하는 것입니다. 이 매크로는 장식되지 않은 함수 이름으로 확장됩니다. 그런 다음 pragma 주석 지시어를 사용하여 다음과 같이 장식된 이름으로 함수를 내보낼 수 있습니다.

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

이 기술을 사용하면 명시적으로 지정하지 않고도 장식된 이름을 지정할 수 있습니다.

By 이러한 접근 방식 중 하나를 따르면 내보낸 함수 이름을 제어하고 .def 파일이나 "extern "C"" 구문을 사용할 때 나타날 수 있는 원하지 않는 "=" 및 장식된 접미사를 피할 수 있습니다.

위 내용은 C DLL에서 내보낸 함수 이름을 제어하는 ​​방법: 장식된 것과 장식되지 않은 것?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.