Mach-O рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдХреНрд╕

рдореИрдВ рдЖрдкрдХреЛ рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд▓реЙрдЧ рд╕реЗ рдЕрдкрдиреЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдереЛрдбрд╝реА рдорджрдж: рдбрд╛рд░реНрд╡рд┐рди - рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬреЛ рдореИрдХрдУрдПрд╕, рдЖрдИрдУрдПрд╕ рдФрд░ рдРрдкреНрдкрд▓ рд╕реЗ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ; рдордЪ-рдУ рдбрд╛рд░реНрд╡рд┐рди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рд╛рд░реВрдк рд╣реИ; рдбрд╛рдИрд▓реНрдб - рдбрд╛рдпрдирд╛рдорд┐рдХ рдмреВрдЯрд▓реЛрдбрд░ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рд░реНрд╡рд┐рди рдиреЗ рдордЪ-рдУ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ; 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 # : $ ld -o libfoo.dylib foo.o -reexport-lobjc 

рдХреЗрд╡рд▓ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ 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 # ...    ) set_property(TARGET CoreFoundation_i386 APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/reexport_i386.exp") set_property(TARGET CoreFoundation_x86_64 APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/reexport_x86_64.exp") 

-


- тАУ , , 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() { //         return 0; } static void *foo_resolver() { __asm__(".symbol_resolver _foo"); return condition() ? &foo1 : &foo2; } 

( _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() { lib_handle = _elfcalls->dlopen_fatal("libX11.so"); } __attribute__((destructor)) static void destructor() { _elfcalls->dlclose_fatal(lib_handle); } void* XOpenDisplay() { __asm__(".symbol_resolver _XOpenDisplay"); return _elfcalls->dlsym_fatal(lib_handle, "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/ .

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


All Articles