рдореИрдВ рдЖрдкрдХреЛ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд▓реЙрдЧ рд╕реЗ рдЕрдкрдиреЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдереЛрдбрд╝реА рдорджрдж: рдбрд╛рд░реНрд╡рд┐рди - рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬреЛ рдореИрдХрдУрдПрд╕, рдЖрдИрдУрдПрд╕ рдФрд░ рдРрдкреНрдкрд▓ рд╕реЗ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ; рдордЪ-рдУ рдбрд╛рд░реНрд╡рд┐рди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рд╛рд░реВрдк рд╣реИ; рдбрд╛рдИрд▓реНрдб - рдбрд╛рдпрдирд╛рдорд┐рдХ рдмреВрдЯрд▓реЛрдбрд░ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рд░реНрд╡рд┐рди рдиреЗ рдордЪ-рдУ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ; dylib рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .dylib
)ред

рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рдХреНрд╖реНрдп рд▓рд┐рдирдХреНрд╕ рдкрд░ рдореИрдХрдУрдПрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдорд╛рдЪ-рдУ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдХреЛ рдордЪ-рдУ рд▓реЛрдбрд░ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдбрд╛рд░реНрд╡рд┐рди рдПрдкреАрдЖрдИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдирдХреНрд╕ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рдмреАрдЪ рдХреЙрд▓ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рд╕реЗ, рд╣рдорд╛рд░рд╛ рдзреНрдпрд╛рди рддреЗрдЬреА рд╕реЗ рдЕрд▓рдЧ рдбрд╛рд░реНрд╡рд┐рди рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдХреЛрдб рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП Mach-O рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рд╣рдо Apple рдХреЗ рдореВрд▓ рдбрд╛рдЗрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдИ рдЕрдиреНрдп рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдбрд╛рд░реНрд╡рд┐рди рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдордЪ-рдУ рдмреВрдЯрд▓реЛрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЦреБрдж рдХреЛ рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдорд╛рдЪ-рдУ, рдордЪ рдХреЗ рд╕рд╛рде рд╣реА, рд╢рд╛рдпрдж рдбрд╛рд░реНрд╡рд┐рди рдХреЗ рд╕рдмрд╕реЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реЙрд▓рдорд╛рд░реНрдХ рд╣реИрдВ, рдФрд░ рдРрдкреНрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рд╡рд┐рднрд┐рдиреНрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ, рдордЪ-рдУ рдкреНрд░рд╛рд░реВрдк рдХреА рдХрдИ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдордЪ-рдУ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбрд╛рд░реНрд╡рд┐рди рдШрдЯрдХреЛрдВ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ (рд╡рд┐рд╢реЗрд╖ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ, рдФрд░ рдЕрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдордЪ-рдУ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рдореВрд▓ рдордЪ-рдУ рд▓реЛрдбрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ - рд╣рдореЗрдВ рдордЪ-рдУ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрд╣реБрдд рдЧрд╣рд░реЗ рд╕реНрддрд░ рдкрд░ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреА рд╣реИ рдбрд╛рд░реНрд╡рд┐рди рдордВрдЪ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ред
рд╣рдо рдЗрд╕ рдкрд░рд┐рдЪрдп рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЪрд╛рд▓реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдЪ-рдУ рдкреНрд░рд╛рд░реВрдк рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдо
рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░, рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рдирд╛рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, libc.so
) рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рдХрд╛ рдХрд╛рд░реНрдп рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬрдирд╛ рд╣реИред рдбрд╛рд░реНрд╡рд┐рди рддреБрд░рдВрдд (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЬрд╛рдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╛рдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ, рдпрд╣ dylib [dylib рдЕрдкрд╣рд░рдг] рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдПрдХ рд╣рдорд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдХрд▓реА dylib рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдирдХрд▓реА dylib рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдУрд░ рд╕реЗ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ред dylib рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рди рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдкреВрд░реНрдг рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдорд╛рдЪ-рдУ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдореЛрдВ рдХреЛ "рдЬрд╛рдирддреЗ" рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред
-dylib_install_name
рдХреЛ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп, рдЖрдк ld -dylib_install_name
рдпрд╛ -dylib_install_name
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
$ ld -o libfoo.dylib foo.o -install_name /usr/local/lib/libfoo.dylib
рдЕрдм рдЬрдм рдЖрдк рдПрдХ рдЕрдиреНрдп рдордЪ-рдУ рдлрд╛рдЗрд▓ ( libbar.dylib
рдХрд╣рддреЗ рд╣реИрдВ) рдХреЛ libfoo.dylib
рд╕реЗ libfoo.dylib
, рддреЛ ld libfoo рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд╛рдо - libbar
- libbar
рдирд┐рд░реНрднрд░рддрд╛ libbar
рдореЗрдВ libbar
, рдФрд░ рдЬрд╣рд╛рдВ рдбрд╛рдЗрд▓реНрдб рд╣реИ рд░рдирдЯрд╛рдЗрдо рдкрд░ libfoo
рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред
рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ; рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдРрдк рдмрдВрдбрд▓ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ /Applications/AppName.app
рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд╕реЗрдВрдмрд▓реА рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реИрдВ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕реА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдбрд╛рд░реНрд╡рд┐рди рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдореЛрдВ рдХреЛ @executable_path
, @loader_path
, рдпрд╛ @rpath
- рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкрде рдХреЗ рдкрде рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, "рд▓реЛрдбрд┐рдВрдЧ" (рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдкрде) рдЬреЛ рд╕реАрдзреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рд╕реНрддреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреНрд░рдорд╢рдГред @executable_path
рдФрд░ @loader_path
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ (рдпрд╛ рдЙрдирдХреА рд╕рдХрд░реНрдордХ рдирд┐рд░реНрднрд░рддрд╛) рдореЗрдВ @rpath
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯрдЕрдк рдирд╛рдо рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ -rpath
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реБрдП @rpath
рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЖрдкрдХреЛ рдХрд┐рддрдирд╛ рд╕рдордп рдЪрд╛рд╣рд┐рдП:
$ ld -o runme -rpath @executable_path/../Frameworks -rpath @executable_path/../bin/lib
(рдХреБрдЫ рд╣рдж рддрдХ rpath рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИ, рдФрд░ dylib рд╕реНрдкреВрдлрд┐рдВрдЧ рд╣рдорд▓реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦреЛрд▓рддреА рд╣реИ ред рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдореЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд╣реИред)
рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛
рдЬрдм рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдпрджрд┐ рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдкрд░рд╕реНрдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред рдпрд╣ рддрдм рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрди рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдХреНрдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХрдИ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдк рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдирдпрд╛ рд╕реНрд╡рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдФрд░ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ Apple рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХрднреА рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕реЛрдЪрдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рдмреИрд╕рд╛рдЦреА рдФрд░ рдЪрд╛рд▓реЗрдВ рдмрд┐рдЫрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди libSystem libSystem
, рдЬреИрд╕реЗ рдХрд┐ libsystem_dyld
, libsystem_kernel
рдФрд░ libsystem_pthread
, рд╕рднреА рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред (рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рд╣рдореЗрдВ рдХреЛрдХреЛрдЖ, рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдХреЛрд░ рдУрдкрдирдЧреНрд▓реЛ рдЬреИрд╕реЗ рдХреЛрдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рднреА рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдж рдХреЛрд░реЛрдЧрд▓ рдореЗрдВ рдХреЛрдХ рдУрдкрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХреЛрд░рдЧреЗрд▓ рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдЪрдХреНрд░реАрдп рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред)
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреИрд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдХрд░ рдХреЙрд▓ рдХреЗрд╡рд▓ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдВрдХрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рд╕рдордп рдЕрдиреНрдп рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдВрдХрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рдпрд╣рд╛рдБ рдкрд░ рдЯреНрд░рд┐рдХ рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ (рдпрд╛ рд╕рд░рд▓рддрд╛, рд╕рднреА рдХреЗ рд▓рд┐рдП) рдХреЛ рджреЛ рдмрд╛рд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░, рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд╛рд╕ рди рдХрд░реЗрдВ:
$ ld -o libfoo.dylib foo.o -flat_namespace -undefined suppress $ ld -o libbar.dylib bar.o -flat_namespace -undefined suppress
(рдиреАрдЪреЗ рджреЗрдЦреЗрдВ -flat_namespace
ред)
рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк dylibs рдХреЛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд░рди рд╕рдордп рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреАред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреВрд╕рд░реА рдмрд╛рд░ рд▓рд┐рдВрдХ рдХрд░реЗрдВ, рдкрд░рд┐рдгрд╛рдореА dylibs рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ:
$ ld -o libfoo.dylib foo.o libbar.dylib $ ld -o libbar.dylib bar.o libfoo.dylib
рдЗрд╕ рдмрд╛рд░, рд▓рд┐рдВрдХрд░ рд╕рднреА рдкрд╛рддреНрд░реЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ (рдФрд░ рдпрджрд┐ рдХреБрдЫ рдЕрдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд╛рдпрдм рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА)ред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХреБрдЫ, рдпрджрд┐ рд╕рднреА рдирд╣реАрдВ, рддреЛ рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА "рдЧрд▓рдд" рдкреНрд░рддрд┐рдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдбрд╛рдЗрд▓реНрдб рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЧреЗред рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рджреЛрдиреЛрдВ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдо рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╡рд┐рд╡рд░рдг рдЖрд░рдВрднреАрдХрд░рдг рдХреНрд░рдо рд╣реИред рдХреЛрдИ рднреА рдХреЛрдб __attribute__((constructor))
рдХрдВрдкрд╛рдЗрд▓рд░ рдореИрдЬрд┐рдХ рдХрдорд╛рдВрдб (рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░реНрд╕ рдХреА рд╕реВрдЪреА __mod_init_func
рд╕реЗ Mach-O рдлрд╛рдЗрд▓ рдореЗрдВ рдкрдбрд╝рддреА рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ __mod_init_func
рдХреА __mod_init_func
ред рдмрд╛рдЗрдирд░реА рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдбрд╛рдИрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ main()
рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рдЪреБрдХреА рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ; рдбрд╛рдЗрд▓реНрдб рдЕрдкрдиреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХрд┐рд╕реА рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдк рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдКрдкрд░ рдХреА рдУрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдбрд╛рдЗрд▓реНрдб рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░реЗрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдиреЗ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЕрдВрддрд┐рдоред рдЗрд╕рд▓рд┐рдП, libfoo
рдХреЛ libfoo
рдмрд╛рдж рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
$ ld -o libfoo.dylib foo.o libbar.dylib $ ld -o libbar.dylib bar.o -upward_library libfoo.dylib
рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбрд╛рд░реНрд▓рд┐рдВрдЧ CMake-function рд╣реИ, рдЬрд┐рд╕реЗ add_circular
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрд╕ рдФрд░ рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
set(DYLIB_INSTALL_NAME "/usr/lib/system/libdispatch.dylib") add_circular(libdispatch_shared FAT SOURCES ${dispatch_SRCS} SIBLINGS system_c system_kernel system_malloc system_blocks system_pthread system_dyld system_duct unwind platform compiler_rt UPWARD objc )
рджреЛ-рд╕реНрддрд░реАрдп рдЪрд░рд┐рддреНрд░ рдирд╛рдо рд╕реНрдерд╛рди
рдордЪ-рдУ рдореЗрдВ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХ рдирд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдпрд╣ рднреА рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓) рд╕реЗ рдХреМрди рд╕рд╛ рдкреНрд░рддреАрдХ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреНрд░рддреАрдХ рдирд╛рдо рдРрд╕реЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕рд▓рд┐рдП "рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдо рд╕реНрдерд╛рди" (рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд░рддреАрдХ рдирд╛рдо рд╕реНрд╡рдпрдВ)ред
рдкреНрд░рддреАрдХ рдирд╛рдо рдХреЗ рдЯрдХрд░рд╛рд╡ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдо рд╕реНрдерд╛рди рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЧрдИ рдереАред рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА; рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЖрдк рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд▓рдЧрдЗрдиреНрд╕) рдпрд╛ рдЬрдм рд▓рд┐рдВрдХ рд╕рдордп рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рдВрдШрд░реНрд╖ рдкреИрджрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдорд╕реНрдерд╛рди рдХреЛ "рдлреНрд▓реИрдЯ рдиреЗрдорд╕реНрдкреЗрд╕" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рдХрд░ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдПрдХ рдлреНрд▓реИрдЯ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ -undefined_suppress
, рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛)ред Ld рдореЗрдВ рджреЛ рдлрд╝реНрд▓реИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВ: -flat_namespace
, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ Mach-O рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ -force_flat_namespace
, рдЬреЛ рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдирд╣реАрдВ, рдФрд░ рдПрдХ рдлреНрд▓реИрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдирд╛рдо рд╕реНрдерд╛рдиред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк DYLD_FORCE_FLAT_NAMESPACE
рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ DYLD_FORCE_FLAT_NAMESPACE
рд╕реЗрдЯ рдХрд░рдХреЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдлреНрд▓реИрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреЛ-рд╕реНрддрд░реАрдп рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдЪ-рдУ рдХреЛ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк AppKit рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ Foundation рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЖрдкрдХреЛ рдЙрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рдврд╛рдВрдЪреЗ рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдирд┐рд░реНрднрд░рддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХ "рдбрд╛рдЙрди" рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреНрдпрд╕реНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ AppKit рд╕реЗ рдлрд╛рдЙрдВрдбреЗрд╢рди рддрдХ рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, Mach-O, ld рдФрд░ dyld рдореЗрдВ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдЙрдк-рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ , рд╡рд░реНрдгреЛрдВ рдХрд╛ рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдореЗрдЯрд╛-рд╡рд░реНрдг ред
рдЙрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ
рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ - рдПрдХ рддрдВрддреНрд░ рдЬреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп ( рдореБрдЦреМрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп [рдЫрд╛рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп] рдпрд╛ рдЫрд╛рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп [рдЫрд╛рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп]) рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЗрд╕реЗ рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдп [рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)); рдпрд╛, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореБрдЦреНрдп рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ, рдЗрд╕рдХреЗ рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде libSystem
рдЬреЛ /usr/lib/system
; рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$ ld -o libfoo.dylib foo.o -lobjc -sub_library libobjc
рдХреЗрд╡рд▓ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ LC_REEXPORT_DYLIB
рдХрдорд╛рдВрдб рдХреЛ рд╕рд╛рдорд╛рдиреНрдп LC_LOAD_DYLIB
рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд▓рд┐рдВрдХрд┐рдВрдЧ рдореЗрдВ рдЙрдк-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдЫрд╛рддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдЕрдЧрд░ рдирдП рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕рдмрд▓реЗрдХреНрдЯрд░реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди, LC_REEXPORT_DYLIB
рднреА LC_REEXPORT_DYLIB
рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: dyld рдЙрдк-рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдмрд╛рдХреА (рд▓реЗрдХрд┐рди LC_LOAD_DYLIB
рд╡рд┐рдкрд░реАрдд, рджреЛ-рд╕реНрддрд░реАрдп рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╡рд░реНрдг рдЫрд╛рддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЖрдПрдВрдЧреЗ) рдЙрдкрд▓рдмреНрдз LC_LOAD_DYLIB
ред
LC_REEXPORT_DYLIB
рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрд▓рдЧ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЛ libfoo
рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ ld рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ dylib рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ libfoo
рдЧрдпрд╛ рдерд╛, рдЬреЛ ld рдереЗ, ld рднреА рдЦреБрд▓реЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЙрдк-рд╕реАрдорд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдЧрд╛ (рдЗрд╕рдореЗрдВ) libobjc
рдЙрджрд╛рд╣рд░рдг)ред
рд╡рд╣ рдХреИрд╕реЗ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИ? libfoo.dylib
рдореЗрдВ рдмрдЪрд╛рдИ рдЧрдИ рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬрд╝ рд╣реИ рд╕реНрдерд╛рдкрдирд╛ рдирд╛рдо libobjc.dylib
, рдЗрд╕рд▓рд┐рдП ld рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдпрд╣ libobjc
рдЬреИрд╕реА рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рдЙрдк-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ld -dylib_file
рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ dylib рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
$ ld -o libfoo.dylib foo.o -reexport_library /path/to/libsubfoo.dylib $ ld -o libbar.dylib bar.o libfoo.dylib -dylib_file @executable_path/lib/foo/libsubfoo.dylib:/path/to/libsubfoo.dylib
рдпрджреНрдпрдкрд┐ libSystem
рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдкрдиреЗ рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ -dylib_file
рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп -dylib_file
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рд▓рд┐рдирдХреНрд╕ рдкрд░ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ ld рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ -dylib_file
рд╡рд┐рдХрд▓реНрдк (рдФрд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ) рдкрд╛рд╕ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ add_darling_library
, add_darling_executable
рдФрд░ рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рддреНрд░
рдХрднреА-рдХрднреА рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХреБрдЫ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ - рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдореЗрдВ - рдХрд┐рд╕реА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди NSObject
рдХреЛ NSObject
, рдЬреЛ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд░рдирдЯрд╛рдЗрдо рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
(рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ NSObject
рдХреНрдпреЛрдВ рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреЗ рдмрдЬрд╛рдп рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдПрдХ рдмрд╛рд░ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореБрдХреНрдд рд░реВрдкрд╛рдВрддрд░рдг [рдЯреЛрд▓-рдлреНрд░реА рдмреНрд░рд┐рдЬрд┐рдВрдЧ, рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдФрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реАрдзреЗ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдкрд╛рдВрддрд░рдг], рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рдЬреА рд░реИрдкрд░ рдХрдХреНрд╖рд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, __NSCFString
) рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рд╣реЛрдВ, рдФрд░ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ NSObject
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╡рддрдГ, рд╕рднреА рджреНрд╡рд╛рд░рд╛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдФрд░ рд▓реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде NSObject
рдЫреЛрдбрд╝рдХрд░ рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдФрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдПрд╕реНрдХреА, рд▓реЗрдХрд┐рди Apple рдиреЗ NSObject
рдХреЗ рд╕рд╛рде рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрди рд╕рд╣рд╛рдпрдХ рдирд┐рдЬреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдореЗрдВ рд╣рдо рдЗрд╕реЗ рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВред)
рдЖрдк рдЕрдкрдиреЗ -reexported_symbols_list
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ -reexported_symbols_list
рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ echo .objc_class_name_NSObject > reexport_list.exp $ ld -o CoreFoundation CFFiles.o -lobjc -reexported_symbols_list reexport_list.exp
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╕рднреА рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ LC_*_DYLIB
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХ ( N_INDIR
рдзреНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд) рдХреЛ рдирд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреАрдХ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдирд╛рдо рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреВрд╕рд░реА , "рдЕрдирд┐рд╢реНрдЪрд┐рдд" рдкреНрд░рддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ)ред
рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдзреНрдпрд╛рди рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, .objc_class_name_NSObject
рдФрд░ x86-64 рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдмрд╛рдЗрдирд░реА рдЗрдВрдЯрд░рдлреЗрд╕ [ABI] рдХреЗ рд▓рд┐рдП [рдиреЗрдо рдореИрдирд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди] рдХрд╛ рдирд╛рдордХрд░рдг рдХрдиреНрд╡реЗрдВрд╢рди рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП i386 рдкрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ .objc_class_name_NSObject
, рдФрд░ x86-64 рдкрд░ .objc_class_name_NSObject
ред _OBJC_CLASS_$_NSObject
, _OBJC_IVAR_$_NSObject.isa
рдФрд░ _OBJC_METACLASS_$_NSObject
ред рдЙрдк-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрд▓рдмреНрдз рдкреНрд░рддреАрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдорд╛рдЪ-рдУ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдХрд░рдг рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ "рдореЛрдЯреА" рдпрд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ (рдордЪ-рдУ рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЙрдк-рдордЪ-рдУ рдХрдИ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓реИрдВрдЧ рд╕рднреА рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдбрд╛рдЗрд▓реЗрдм рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЕрдорд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрд▓рдбреА, рдУрдЯреВрд▓ рдФрд░ рдПрдирдПрдо рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдЕрдиреБрд░реВрдк рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд ред x86-64), рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред , - , тАУ , , .
. ld , , dylib- lipo:
$ ld -o CF_i386.dylib CFFiles.o -arch i386 -lobjc -reexported_symbols_list reexport_i386.exp $ ld -o CF_x86-64.dylib CFFiles.o -arch x86_64 -lobjc -reexported_symbols_list reexport_x86_64.exp $ lipo -arch i386 CF_i386.dylib -arch x86_64 CF_x86-64.dylib -create -output CoreFoundation
Darling CMake- add_separated_framework
, lipo, CMake- Core Foundation :
add_separated_framework(CoreFoundation CURRENT_VERSION SOURCES ${cf_sources} VERSION "A" DEPENDENCIES objc system icucore LINK_FLAGS
- тАУ , , Apple , .
Mach-O- macOS, , -mmacosx-version-min=10.x
( iOS, tvOS, watchOS , Apple ). ; , AVAILABLE_MAC_OS_X_VERSION_10_13_AND_LATER
C++ libstdc++
( GNU) libc++
( LLVM). , Mach-O. , ld -macosx_version_min
( m
), Mach-O- LC_VERSION_MIN_MACOSX
( dyld, , ).
, ld -macosx_version_min
, - Mach-O- . - тАУ , $ld$
, ld, , : , . $ld$$$
.
os10.5
, - тАУ , Mach-O- , ;
add
, hide
, install_name
compatibility_version
, ld ,
,
( ) , .
, , , ; , -, libobjc
, NSObject
, macOS:
$ld$hide$os10.0$_OBJC_CLASS_$_NSObject $ld$hide$os10.0$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.0$_OBJC_METACLASS_$_NSObject $ld$hide$os10.1$_OBJC_CLASS_$_NSObject $ld$hide$os10.1$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.1$_OBJC_METACLASS_$_NSObject $ld$hide$os10.2$_OBJC_CLASS_$_NSObject $ld$hide$os10.2$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.2$_OBJC_METACLASS_$_NSObject $ld$hide$os10.3$_OBJC_CLASS_$_NSObject $ld$hide$os10.3$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.3$_OBJC_METACLASS_$_NSObject $ld$hide$os10.4$_OBJC_CLASS_$_NSObject $ld$hide$os10.4$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.4$_OBJC_METACLASS_$_NSObject $ld$hide$os10.5$_OBJC_CLASS_$_NSObject $ld$hide$os10.5$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.5$_OBJC_METACLASS_$_NSObject $ld$hide$os10.6$_OBJC_CLASS_$_NSObject $ld$hide$os10.6$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.6$_OBJC_METACLASS_$_NSObject $ld$hide$os10.7$_OBJC_CLASS_$_NSObject $ld$hide$os10.7$_OBJC_IVAR_$_NSObject.isa $ld$hide$os10.7$_OBJC_METACLASS_$_NSObject
, , , , .
dyld тАУ [symbol resolvers], . , , , dyld , .
ld, . .symbol_resolver
:
; foo _foo1: movl 1, %eax ret _foo2: movl 2, %eax ret .symbol_resolver _foo ; - call _condition jz .ret_foo2 movq _foo1, %rax ret .ret_foo2: movq _foo2, %rax ret ; , _foo ; , , ; . .global _foo _foo:
C , , C:
static int foo1() { return 1; } static int foo2() { return 2; } int foo() {
( _foo
foo
, Darwin C, . , Mach-O Darling, ELF-, .)
_foo
, ( ), foo()
foo_resolver()
, :
void *foo() { __asm__(".symbol_resolver _foo"); return condition() ? &foo1 : &foo2; }
, тАУ - , foo()
, ( int
-). , , : dlsym("_foo")
_foo
тАУ , , , тАУ . , , , foo()
_foo
.
. Apple libplatform
:
#define _OS_VARIANT_RESOLVER(s, v, ...) \ __attribute__((visibility(OS_STRINGIFY(v)))) extern void* s(void); \ void* s(void) { \ __asm__(".symbol_resolver _" OS_STRINGIFY(s)); \ __VA_ARGS__ \ } #define _OS_VARIANT_UPMP_RESOLVER(s, v) \ _OS_VARIANT_RESOLVER(s, v, \ uint32_t *_c = (void*)(uintptr_t)_COMM_PAGE_CPU_CAPABILITIES; \ if (*_c & kUP) { \ extern void OS_VARIANT(s, up)(void); \ return &OS_VARIANT(s, up); \ } else { \ extern void OS_VARIANT(s, mp)(void); \ return &OS_VARIANT(s, mp); \ })
, тАУ тАУ ( kUP
, commpage ), , , [spinlock]. , .
Darling : Mach-O- ELF- Linux, [host, , Darling] тАУ , libX11
libcairo
.
ELF- тАУ libelfloader
, ELF, , ld-linux, dyld Linux, ld-linux ELF-. libelfloader
Mach-O /usr/lib/darling/libelfloader.dylib
Darwin-chroot-; , Darwin-.
, libelfloader
Mach-O ELF. ( _elfcalls
), libSystem
, Darwin , ELF- Linux. ┬л┬╗ Darwin Linux тАУ , C ( libSystem_c
glibc
, ).
ELF- Darwin, - libelfloader
API _elfcalls->dlsym_fatal(_elfcalls->dlopen_fatal("libX11.so"), "XOpenDisplay")
. , wrapgen , ELF- , , The Cocotron тАУ Linux тАУ . wrapgen ELF- (, libX11.so
), :
#include <elfcalls.h> extern struct elf_calls* _elfcalls; static void* lib_handle; __attribute__((constructor)) static void initializer() __attribute__((destructor)) static void destructor() void* XOpenDisplay()
Mach-O- /usr/lib/native/libX11.dylib
, Mach-O- , libX11.so
, Mach-O. , CMake- wrap_elf
, wrapgen, Mach-O- /usr/lib/native
: wrap_elf(X11 libX11.so)
libX11
, Mach-O-.
Linux . , Darling , Darwin Linux, . Darling тАУ Darwin ( , Darwin); , , , Darwin, libSystem
, dyld, XNU launchd, , , commpage. , libsystem_kernel
, , Linux, ┬л┬╗ Darwin- тАУ Linux GNU/Linux . Linux- , Linux ( X server) , [witnessing a magic trick] тАУ libelfloader
, wrapgen, , . , , , , , .
- , Mach-O-, ld . ( , тАУ , Apple, , .)
, , , , [order file], ld :
$ ld -o libfoo.dylib foo.o -order_file foo.order
-reexported_symbols_list
, , -order_file
, :
symbol1 symbol2 # . # # , , # ( C) # . foo.o: _static_function3 # , , # ; # # lipo, # . i386:symbol4
( , , ) ┬л┬╗ . , , , , .subsections_via_symbols
, Mach-O- , , , , .
, Apple тАУ libdispatch
. libdispatch
, ┬лOS object┬╗, , . Objective-C, libdispatch
( Core Foundation), libdispatch
- Objective-C- , Objective-C-. , dispatch_data_t
NSData *
API Cocoa ( ).
, , Objective-C- OS object vtables . , DISPATCH_OBJECT_TFB
, , Objective-C libdispatch
-, isa
vtable
- dispatch_object
object
:
#define DISPATCH_OBJECT_TFB(f, o, ...) \ if (slowpath((uintptr_t)((o)._os_obj->os_obj_isa) & 1) || \ slowpath((Class)((o)._os_obj->os_obj_isa) < \ (Class)OS_OBJECT_VTABLE(dispatch_object)) || \ slowpath((Class)((o)._os_obj->os_obj_isa) >= \ (Class)OS_OBJECT_VTABLE(object))) { \ return f((o), ##__VA_ARGS__); \ }
, , libdispatch
.
( ) тАУ DYLD_INSERT_LIBRARIES
, dyld Mach-O- . , , , DYLD_FORCE_FLAT_NAMESPACE
.
, , - . ( ), dlsym()
RTLD_NEXT
, :
int open(const char* path, int flags, mode_t mode) { printf(" open(%s)\n", path); // " " if (strcmp(path, "foo") == 0) { path = "bar"; } int (*original_open)(const char *, int, mode_t); original_open = dlsym(RTLD_NEXT, "open"); return original_open(path, flags, mode); }
, dyld , dyld- [dyld iterposing]. Mach-O- __interpose
, dyld , тАУ .
, тАУ , __interpose
тАУ [implicit interposing]. , __interpose
( ), dyld . , dyld- , - . , dyld , - , - ( Mach-O-):
static int my_open(const char* path, int flags, mode_t mode) { printf("Called open(%s)\n", path); // " " if (strcmp(path, "foo") == 0) { path = "bar"; } // , // open() my_open(). return open(path, flags, mode); } // __interpose __attribute__ ((section ("__DATA,__interpose"))) static struct { void *replacement, *replacee; } replace_pair = { my_open, open };
, тАУ тАУ Mach-O- - [relocation table]. , dyld ( ), .
, dyld_dynamic_interpose
, :
typedef struct { void *replacement, *replacee; } replacement_tuple; extern const struct mach_header __dso_handle; extern void dyld_dynamic_interpose(const struct mach_header*, const replacement_tuple replacements[], size_t count); void interpose() { replacement_tuple replace_pair = { my_open, open }; dyld_dynamic_interpose(&__dso_handle, &replace_pair, 1); }
, , , .
DYLD_INSERT_LIBRARIES
dyld- Objective-C, C, - , Objective-C- ( IMP
), Objective-C , method swizzling ( isa swizzling ).
Darling xtrace, .
Darwin Darwin ( тАУ BSD Mach- [Mach traps]). libsystem_kernel
, ABI userspace. Darling, libsystem_kernel
Darwin Linux Darling-Mach , Linux, Mach .
strace, Linux, , Linux-; strace Darwin, Darling, Linux, Darwin ( Linux, ELF- ). , Darwin Linux , , Darwin тАУ , тАУ .
, xtrace . strace, , ptrace()
API, xtrace . DYLD_INSERT_LIBRARIES=/usr/lib/darling/libxtrace.dylib
, - [trampoline functions] , . xtrace , strace, , , :
Darling [~]$ xtrace arch <......> [223] mach_timebase_info_trap (...) [223] mach_timebase_info_trap () -> KERN_SUCCESS [223] issetugid (...) [223] issetugid () -> 0 [223] host_self_trap () [223] host_self_trap () -> port right 2563 [223] mach_msg_trap (...) [223] mach_msg_trap () -> KERN_SUCCESS [223] _kernelrpc_mach_port_deallocate_trap (task=2563, name=-6) [223] _kernelrpc_mach_port_deallocate_trap () -> KERN_SUCCESS [223] ioctl (...) [223] ioctl () -> 0 [223] fstat64 (...) [223] fstat64 () -> 0 [223] ioctl (...) [223] ioctl () -> 0 [223] write_nocancel (...) i386 [223] write_nocancel () -> 5 [223] exit (...)
, BSD Mach. , write()
exit()
, Linux-, . , Mach- ioctl
- /dev/mach
, ; BSD- ioctl()
, stdio , stdin stdout ( tty) readlink()
/proc/self/fd/
.
Mach-O, , dyld. :
- , , dylib, , . ld
-bundle_loader
. - ,
LC_LOAD_DYLIB
, LC_REEXPORT_DYLIB
LC_DYLIB_ID
, [compatibility version, current version] , тАУ , . ld -current_version
-compatibility_version
, . dyld , , , . - , Mach-O [source version]. ,
LC_SOURCE_VERSION
. ld -source_version
, , Mach-O- тАУ -add_source_version
-no_source_version
. Info.plist
__info_plist
Mach-O- [codesign] , Info.plist
. ad-hoc Security.framework, , CFBundle
/ NSBundle
API, , , .
, , , ld dyld , ┬л ┬╗, libSystem
, -. /usr/lib/
.