2011-01-05 3 views
2

내 회사에서는 .def 개의 파일을 사용하여 내보낼 기호를 지정합니다. (나는 더 현대적이고 자동화 된 기술을 사용할 수 있었으면 좋겠다. 불행히도, 80 년대에 살기로 결정한 사람들).32 비트 .def 파일을 64 비트로 변환

.def 파일을 수동으로 작성하면 수동 복사 붙여 넣기를 사용하는 것이 지루하고 오류가 발생하기 쉽지만 지금까지는 그 파일과 함께 살 수 있습니다.

그러나 DLL의 64 비트 버전에 대해 비슷한 .def 파일을 작성해야합니다. 여러 함수의 이름 장식이 변경되었고 32 비트 버전에서 64 비트 버전의 파일을 .def으로 생성하는 방법이 있는지 궁금합니다.

나를 도울 수있는 도구가 있습니까? 이것은 현실적인 것인가? 나는 한 번 더 손으로 그것을하고 싶다는 생각이 들지 않습니다. 모든 솔루션, 심지어 내 도구를 코딩하는 것을 포함하는 솔루션도 환영합니다.

감사합니다.

+0

안녕하세요, 나는 80 년대에도 살아있었습니다. –

답변

2

필자는 원하는 기호를 __declspec (dllexport)하고 컴파일 한 다음 결과 DLL에서 dumpbin/exports를 실행하여 맹 글링 된 이름을 얻은 다음 __declspec을 제거하고 .def 파일을 만들 수 있습니다.

+0

+1. 아이디어를 가져 주셔서 감사합니다. 효과적입니다. 그러나 나는 소스 코드의 수정을 최소한으로 줄이고 싶다. 조건부로 매크로를 사용하면 소스 코드를 수정하지 않고'__declspec' 문을 입력/제거 할 수 있습니다. – ereOn

+0

매크로를 추가하거나 __declspec을 추가하면 코드가 같은 양만큼 변경됩니다. 거기에 어떤 위험도 보이지 않습니다. 그러나 실제로 코드를 변경하고 싶지 않다면 디버그로 컴파일하고 DLL에서 loadlibrary를 windbg에로드하고 "x Mymodule! *"을 실행하여 모든 심볼을 나열한 다음 거기에서 원하는 것을 골라 낼 수 있습니다. – jcopenha

1

상사에게 80 년대로 돌아가라고 말하십시오. 진지하게 말하자면, 이것은 심볼 이름을 내보내기위한 이식성있는 방법이 아닙니다. C++ 컴파일러가 이름 변환 체계를 변경하면 어떻게 될까요? 그렇다면 당신은 이것을 다시해야 할 것입니다 (jcopenha가 말한 것). 그것이 일어 났을 때 당신이 거기에서 일하지 않는다면? 다른 가난한 영혼이 무엇을 어떻게 할 것인지 알아내는 데 귀중한 시간을 할애해야합니까? 나는 상사에게 __declspec(dllexport)을 사용하도록 설득하려고합니다. 이제는 시간을 절약하고 미래에는 시간을 절약 할 수 있습니다.

클래스를 내보내고 오버로드 된 함수라고 가정합니다. 그렇지 않다면 대신 C 이름으로 함수를 익스포트 할 것입니다. 그 이름은 엉망이 아니며 바뀌지 않을 것입니다.

+0

실제로 수업을 내보내고 있습니다. 그들은'.def' 파일을 사용하여 함수 이름을 "숨기거나"대신 서수를 사용하기를 원합니다 (사용자가 어떤 함수를 내보낼 지 짐작할 수 없도록하기 위해 ...). 나는 이것이 끔찍한 이유이며 어떤 것도 멈추지 않을 것이라고 믿습니다. 재능있는 "해커"가 기능 서명을 찾습니다. – ereOn

+0

아참. 빌드 프로세스에서 자동화하려고합니다. __declspec()을 사용하는 별도의 빌드 솔루션을 만듭니다 (일반 빌드에서는 아무 것도 확장하지 않는 매크로에서 숨김). 출력에서 dumpbin을 실행하고 dumpbin 결과를 기반으로 .def 파일을 만들고이를 프로젝트에 병합하십시오. 그렇게하면 상당히 자동화되고, 다른 컴파일러로 전환하면 불어날 수 없습니다. 매크로를 사용하기 위해 기억해야합니다. –

+0

DEF 파일에 문제를 일으키는 이름 변경 계획 변경에 대한 설명 뒤에있는 추론을 이해할 수 없습니다. 나는 DEF 파일이 dllexport를 사용할 때 맹 글링 된 이름을 가지기 때문에 이름 변경 문제를 피할 수있는 방법이라고 생각했다. 그러나 DEF 파일을 사용할 때 이름을 지정하면 내 경험. – BlueMonkMN