рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЙрдкрдпреЛрдЧ (C / C ++, рдкрд╛рд╕реНрдХрд▓)

рдХрд╛рд░реНрдп


рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдбрд░ рд▓рд┐рдЦрдирд╛ рдерд╛, рдЬреЛ рдмрд╛рд╣рд░реА рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд╕рдорд╛рдзрд╛рди рдпрдерд╛рд╕рдВрднрд╡ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдХрдо рд╕реЗ рдХрдо, рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЪрд▓рд╛рдПрдВ)ред рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реА рдФрд░ рдкрд╛рд╕реНрдХрд▓ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

рдирд┐рд░реНрдгрдп


рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдбрд░ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдореБрдЦреНрдп рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рднреА рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред Gcc (рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдорд┐рдирдЧрд╡) рдФрд░ fpc рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ (рдкрд╛рд╕реНрдХрд▓ рдЕрдХреНрд╕рд░ рд╕реНрдХреВрд▓ рдореЗрдВ рдкрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред


рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдбрд░

рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддреА рд╣реИ:
main.c

#include "loader.h" #ifdef __cplusplus extern "C" { #endif int main(int argc, char *argv[]) { if (argc > 1) { loadRun(argv[1]); } return 0; } #ifdef __cplusplus } #endif 


рдФрд░ рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ:
loader.c

 #include "loader.h" #include "functions.h" #include <stdio.h> #ifndef WIN32 #include <dlfcn.h> #else #include <windows.h> #endif #ifdef __cplusplus extern "C" { #endif void printString(const char * const s) { printf("String from library: %s\n", s); } void loadRun(const char * const s) { void * lib; void (*fun)(void); #ifndef WIN32 lib = dlopen(s, RTLD_LAZY); #else lib = LoadLibrary(s); #endif if (!lib) { printf("cannot open library '%s'\n", s); return; } #ifndef WIN32 fun = (void (*)(void))dlsym(lib, "run"); #else fun = (void (*)(void))GetProcAddress((HINSTANCE)lib, "run"); #endif if (fun == NULL) { printf("cannot load function run\n"); } else { fun(); } #ifndef WIN32 dlclose(lib); #else FreeLibrary((HINSTANCE)lib); #endif } #ifdef __cplusplus } #endif 

рд╣реИрдбрд░ рдлрд╛рдЗрд▓реЗрдВ

рдпрд╣ рд╕рдм рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛, рдФрд░ рдЕрдм рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВред
рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:
loader.h

 #ifndef LOADER_H #define LOADER_H #ifdef __cplusplus extern "C" { #endif extern void loadRun(const char * const s); #ifdef __cplusplus } #endif #endif 


рдпрд╣рд╛рдВ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреВрдЯрд▓реЛрдбрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ (рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
functions.h

 #ifndef FUNCTIONS_H #define FUNCTIONS_H #ifdef __cplusplus extern "C" { #endif extern void printString(const char * const s); #ifdef __cplusplus } #endif #endif 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рд┐рдВрдЯрд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╣реИред

рд▓реЛрдбрд░ рд╕рдВрдХрд▓рди

рдЧреИрд░-рд╡рд┐рддрд░рдг рд╕рдВрдХрд▓рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг (рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ -DWIN32 рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛):
 $ gcc -Wall -c main.c $ gcc -Wall -fPIC -c loader.c $ gcc -shared -o libloader.so loader.o -ldl $ gcc main.o -ldl -o run -L. -lloader -Wl,-rpath,. 

рд╡рд┐рддрд░рдг рд╕рдВрдХрд▓рди рдЧреИрд░-рд╡рд┐рддрд░рдг рд╕рдВрдХрд▓рди рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд╡рд┐рддрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ / usr / lib рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдкрддреНрд░ lib $ (NAME) .soред $ (рд╕рдВрд╕реНрдХрд░рдг) рд╣реИ, рдЧреИрд░-рд╡рд┐рддрд░рдг рд╕рдВрдХрд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ lib $ (NAME) .so, рдФрд░ред рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдиреНрдЪ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реБрдЖ:
 $ nm run | tail -n 2 U loadRun 08048504 T main $ nm libloader.so| tail -n 4 000005da T loadRun 000005ac T printString U printf@@GLIBC_2.0 U puts@@GLIBC_2.0 

рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝рдВрдХреНрд╢рди рдмрд╛рд╣рд░реА рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (ABI) рд╣реИред

рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп


рдЕрдм рдЖрдЗрдП рд╕реНрд╡рдпрдВ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрдПрдВред
C рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
lib.c

 #include "functions.h" #ifdef __cplusplus extern "C" { #endif void run(void) { printString("Hello, world!"); } #ifdef __cplusplus } #endif 

рдпрд╣рд╛рдБ рд╣рд░ рдЬрдЧрд╣, рдмрд╛рд╣рд░реА "C" {} рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ C ++ рдХрдВрдкрд╛рдЗрд▓рд░, рдЬреИрд╕реЗ g ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдмрд╕ C ++ рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде, рдХреНрд░рдорд╢рдГ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреЗ рддрдерд╛рдХрдерд┐рдд рд╕рдЬрд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ABI рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╛рд╣рд░реА "рд╕реА" {} рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕ рд╕рдЬрд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдЬрд╛рд╡рдЯ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ)ред

рд╕рдВрдХрд▓рди

 $ gcc -Wall -fPIC -c lib.c $ gcc -shared -o lib.so lib.o 

рдПрдмреАрдЖрдИ:
 $ nm lib.so | tail -n 2 U printString 0000043c T run 

рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
 $ ./run lib.so String from library: Hello, world! 

рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрд╛рд╣рд░реА "C" {} рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ gcc рдХреЗ рдмрдЬрд╛рдп g ++ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:
 $ nm lib.so | grep run 0000045c T _Z3runv 

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ ABI рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдмреВрдЯрд▓реЛрдбрд░ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд░рди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ:
 $ ./run lib.so cannot load function run 


рдкрд╛рд╕реНрдХрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛, рд╣рдорд╛рд░реЗ рд▓реЛрдбрд░ рдХреЗ рд▓рд┐рдП C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░реА "C" {} рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдирд╛ рдерд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ C / C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред рд╣рдо FreePascal рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ - рдкрд╛рд╕реНрдХрд▓? рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рднреА, рдХреЛрдИ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реА рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рди C / C ++ рдкрд╛рд╕реНрдХрд▓ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
func.pas

 unit func; interface procedure printString(const s:string); stdcall; external name 'printString'; implementation end. 


рдпрд╣рд╛рдБ рдкрд╛рд╕реНрдХрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
modul.pas

 library modul; uses func; procedure run; stdcall; begin printString('Hello from module!'); end; exports run; begin end. 

рд╕рдВрдХрд▓рди

 $ fpc -Cg modul.pas  Free Pascal  2.5.1 [2011/02/21]  i386 Copyright (c) 1993-2010 by Florian Klaempfl  : Linux for i386  modul.pas  libmodul.so /usr/bin/ld: warning: link.res contains output sections; did you forget -T? /usr/bin/ld: warning: creating a DT_TEXTREL in a shared object. 13  p, 6.6  

рд╣рдо рдкрд░рд┐рдгрд╛рдореА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ ABI рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
 $ nm libmodul.so U printString 000050c0 T run 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдБ рдХреБрдЫ рднреА рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрд▓рдбреА рдЪреЗрддрд╛рд╡рдиреА рдЦрддрд░рдирд╛рдХ рд╣реИред Google рдореЗрдВ рд╣рдо рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдг рдвреВрдВрдврддреЗ рд╣реИрдВ , рдпрд╣ PIC рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдХреЗ рдХрд╛рд░рдг рд╣реИ (рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб - рдХреЛрдб рдПрдХ рднреМрддрд┐рдХ рдкрддреЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрджрдореА fpc рдореЗрдВ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ -Cg рд╡рд┐рдХрд▓реНрдк рдХреЛ рдПрдХ PIC рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдЬреАрдм рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ fpc рдЕрдкрдиреЗ рд╡рд╛рджреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдм рдЕрдкрдиреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ 'PrintString' рдирд╛рдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:
 $ nm libmodul.so U FUNC_PRINTSTRING$SHORTSTRING 000050d0 T run 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, FreePascal рдореЗрдВ рджреГрд╢реНрдпрд╛рд╡рд▓реА g ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореМрдЬреВрдж рднреА рд╣реИред
рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:
 $ ./run libmodul.so ./run: symbol lookup error: ./libmodul.so: undefined symbol: FUNC_PRINTSTRING$SHORTSTRING 

рдФрд░ рд╣рдореЗрдВ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде:
 $ ./run libmodul.so String from library: Hello from module! 

рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╣рдо рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдБрдЪ рдЪреБрдХреЗ рд╣реИрдВ - рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХреЛрдб рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдХ рдЦреБрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рдерд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рд╡реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд▓рдЧ-рдЗрди рд╣реИрдВ)ред

рд▓реЛрдбрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпреЗ рдкреНрд▓рдЧ рдЗрди рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рди рдХрд░ рд╕рдХреЗрдВред рддрджрдиреБрд╕рд╛рд░, рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдпрд╛ рдЙрд╕реА рд╕реА ++ рдореЗрдВ) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рд╣рд┐рддреНрдп


Source: https://habr.com/ru/post/In122757/


All Articles