Kompatybilność bibliotek przy różnych kompilatorach

1

Kilka dni temu ktoś wrzucił tu na forum film odnośnie bibliotek dll:

Moje pytanie jest w jaki sposób działają techniki typu hijacking dll skoro nie wiemy nawet jaki kompilator stworzył dany plik exe. Na filmie facet korzysta z GNU i podmienia dowolne pliki dll na te stworzone przez siebie.

Chciałbym zrozumieć dlaczego na stronie Microsoftu napisane jest że nie ma zagwarantowanej kompatybilności nawet pomiędzy dwoma kolejnymi wersjami kompilatora który jest w visual studio. I to z zaznaczeniem że nie chodzi tylko o pliki obj co mógł bym zrozumieć ale również o lib i dll. W jaki sposób więc aplikacja napisana z 15 lat temu w nie wiadomo jakim kompilatorze jest w stanie odpalić plik DLL który został stworzony w jakimś zupełnie innym?
Co wpływa na poprawne działanie? Czy użycie extern "C" przy deklarowaniu funkcji zmienia cokolwiek oprócz tego że pominięte zostanie dekorowanie nazwy funkcji? Czy może chodzi o to że nie ma żadnych problemów ale tylko w wypadku prostych funkcji typu skopiowanie pliku albo przechwycenie ciągu znaków i problemy pojawiają się dopiero jak by ktoś chciał pisać duże aplikacje i korzystać z bibliotek z innych kompilatorów?

1

Nie można mieszać różnych wersji w przypadku kodu używającego (przekazującego jako parametry do i z dll-ki) klas C++, np. std::string. Bo z wersji na wersję implementacja tej klasy się zmienia.
Nie ma problemu kiedy eksportowane funkcje mają jako parametry tylko typy proste, albo jasno zdefiniowane struktury. Przykładowo char* to zawsze char*.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0