èªè ã¯ããã³ã³ãã€ã©ããããªããžã§ã¯ããã¡ã€ã«ããããªã³ã«ãŒãããéçã©ã€ãã©ãªãããåçã©ã€ãã©ãªãããåçããŒããŒããªã©ã®æåã»ããã«ç²ŸéããŠãããšæ³å®ããããããäœãåã¿ãŸããã
åçã©ã€ãã©ãªã®éçããŒãã®åé¡ïŒ
main.exeã¯version-0.3.dllããã³bar.dllã«äŸåããŠããŸãã äžæ¹ãããŒã¯ããŒãžã§ã³0.3ãšãã€ããªäºæã§ã¯ãªãããŒãžã§ã³0.2.dllã«äŸåããŠããŸãïŒæåãååšããªãã ãã§ãªããååãäžèŽããŸãããåŒæ°ã®æ°ãç°ãªãããç°ãªãæ§è³ªã®ãªããžã§ã¯ããäœæãããªã©ïŒã version-0.2.dllã®æåã¯version-0.3.dllããåé€ãããŸããïŒ ã©ã€ãã©ãªã®éçããŒãžã§ã³ïŒããšãã°version-0.2.libïŒãšåçããŒãžã§ã³ïŒversion-0.3.dllïŒã䜿çšããå Žåã«ãåãåé¡ãçºçããŸãã
- ããŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ã®äœæïŒãã€ãããã¯ããŒããŒã¯ãåã®æ®µèœã®ã¢ããªã±ãŒã·ã§ã³ã®version-0.?.dllããã³bar.dllãã©ãã§æ€çŽ¢ããŸããïŒ å¥ã®ãã©ã«ããŒã«ç§»åããå Žåãmain.exeã®äŸåé¢ä¿ãæ€åºããŸããïŒ main.exeãã¢ã»ã³ãã«ããŠãå®è¡å¯èœãã¡ã€ã«ã«å¯ŸããŠäŸåé¢ä¿ãæ€çŽ¢ããæ¹æ³ã¯ïŒ
- äŸåé¢ä¿ã®å°çïŒåãã©ã€ãã©ãªã®2ã€ã®ããŒãžã§ã³/opt/kde3/lib/libkdecore.soããã³/opt/kde4/lib/libkdecore.soïŒããã«ãããã©ãºããèœã¡ãªããªããŸãïŒãããã°ã©ã ã®ååãæåãå¿ èŠãšããããã°ã©ã ã®æ®ãã®ååã2çªç®ãå¿ èŠãšããŸãã äž¡æ¹ã®ã©ã€ãã©ãªã1ã€ã®ã¹ã³ãŒãïŒ1ã€ã®ãã£ã¬ã¯ããªïŒã«é 眮ããããšã¯ã§ããŸããã ããŒãžã§ã³ã©ã€ãã©ãªã®2ã€ã®ããŒãžã§ã³ãåããã£ã¬ã¯ããªã«é 眮ããå¿ èŠãããããããã€ã³ã1ã«ãåãåé¡ãååšããŸãã
æåã®æ®µèœãèªãã åŸãèªè ã¯å«ã¶ãããããŸããã 圌ãã¯ããããŸããïŒ ã©ã€ãã©ãªã®1ã€ã®ããŒãžã§ã³ã䜿çšããå¿ èŠããããŸãïŒâã¯ããããã§ããã人çã§ã¯ãã¹ãŠãèµ·ãããŸãã æãåçŽãªäŸïŒã¢ããªã±ãŒã·ã§ã³ã¯ã©ã€ãã©ãªaãšãµãŒãããŒãã£ã®ã¯ããŒãºãã©ã€ãã©ãªïŒããã¯ä»ã®èª°ãã®ææ補åã匷調ããŸã ïŒbã䜿çšããŸãã
巚倧ãªãããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã®ãã1ã€ã®äŸã¯ãããŸããŸãªéšåã®ãªãªãŒã¹ã«ã¯ç°ãªãæéããããšããäºå®ã§ãïŒç§ãã¡ã®ããŒã ãééãããã®ããã¹ããäžè¬çã«æžãããåå ïŒã ãããã£ãŠãäž»ãªè£œåã¯ããã©ã°ã©ã1ã§èª¬æããæ§æã§ãšãã©ãåºãŠããããšããããŸãã
äŸåé¢ä¿ã®å°çã¯ãã·ã¹ãã ã©ã€ãã©ãªãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®éçºè ã«ãšã£ãŠããéèŠã§ãããã¢ããªã±ãŒã·ã§ã³é åã§ãçºçããå¯èœæ§ããããŸãã ç¹°ãè¿ããŸãããããã€ãã®å®è¡å¯èœããã°ã©ã ããã巚倧ãªãããžã§ã¯ãããããšããŸãã ãããã¯ãã¹ãŠ1ã€ã®ã©ã€ãã©ãªã«äŸåããŠããŸãããããŒãžã§ã³ãç°ãªããŸãã ïŒããã¯ã¹ããã1ãšåãç¶æ³ã§ã¯ãããŸããïŒ1ã€ã®ããã»ã¹ã«åãã©ã€ãã©ãªã®2ã€ã®ããŒãžã§ã³ãããŒããããããã§ã¯1ã€ã ããåããã»ã¹ã«ããŒããããŸãããããããç¬èªã®ããŒãžã§ã³ã䜿çšããŸãïŒã
å°çããã®è±åº
çãã¯ç°¡åã§ããããŒãžã§ã³ãã©ã€ãã©ãªãã¡ã€ã«åã«è¿œå ããå¿ èŠããããŸãã ããã«ãããã©ã€ãã©ãªãã¡ã€ã«ã1ã€ã®ãã£ã¬ã¯ããªã«é 眮ã§ããŸãã åæã«ãAPIã§ã¯ãªãABIããŒãžã§ã³ãè¿œå ããããšããå§ãããŸããããã«ããã2ã€ã®äžŠè¡ããŒãžã§ã³ãã©ã³ããšããã«å¯Ÿå¿ããå°é£ãäœæãããŸãã
ããŒãžã§ã³ç®¡çã¯éåžžã«æ¥åžžçãªä»äºã§ãã xyzã¹ããŒã ãæ€èšããŠãã ããã
- x-é倧ãªåé¡ã äºææ§ã®è©±ã¯ãããŸããã
- y-軜埮ãªåé¡ã Libaã¯ãœãŒã¹ã¬ãã«ã§äºææ§ããããŸããããã€ããªäºææ§ãå£ããŠããå¯èœæ§ããããŸãã
- zã¯ãã°ä¿®æ£ã§ãã Libaã¯äž¡æ¹åã«äºææ§ããããŸãã
ãã¡ã€ã«åã«xyãå«ããããšã¯åŠ¥åœã§ããããã€ããŒããŒãžã§ã³ãå¢ãããªããäºææ§ãç¶æãããŠããå Žåã¯ã察å¿ããã·ã³ããªãã¯ãªã³ã¯ãäœæããã ãã§ååã§ãã
version-1.1.dll
version-1.0.dllâversion-1.1.dll
version-1.1.0ã䜿çšããã¢ããªã±ãŒã·ã§ã³ãšversion-1.0.xã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ãæ©èœããŸãã
äºææ§ãå£ããŠããå Žåãã·ã¹ãã ã«ã¯2ã€ã®ãã¡ã€ã«ããããåã³ãã¹ãŠãæ©èœããŸãã
äœããã®çç±ã§ãã°ä¿®æ£äžã«äºææ§ã倱ãããå Žåããã€ããŒããŒãžã§ã³ãå¢ããå¿ èŠããããŸãïŒãæ°ã«å ¥ãã®Qtã®ããŒã ãè¡ã£ãããã«ã倱æãããã®ã¯äœããããŸããïŒ [1] ïŒã
ãšããã§ãAPIããŒãžã§ã³ãå«ããããšãçŠæ¢ãã人ã¯ããŸãããããããã°ãããå€ãã®ã·ã³ããªãã¯ãªã³ã¯ãäœæãããŸãã å€ãã®å Žåãäºææ§ãç¶æãããŸãã ãããããã®å ŽåãèšåãããQtãã¡ã€ã«ã¯ç°¡åã«è§£æ±ºããããã€ããŒããŒãžã§ã³ã匷å¶çã«å¢ããããšã¯ãããŸããã
ããã¯ãã¹ãŠã®ãã©ãããã©ãŒã ã«åœãŠã¯ãŸããŸãã
æ®ãã®2ã€ã®åé¡ã®è§£æ±ºçã¯ãOSã«ãã£ãŠç°ãªããŸãã
ELFïŒGNU ldïŒLinuxã* BSDãªã©ïŒ
ELF圢åŒã®å ±æã©ã€ãã©ãªã«ã¯ãããããSONAMEããããŸã [2] [3] ã ããã¯ãDT_SONAMEã»ã¯ã·ã§ã³ã®ãã€ããªãã¡ã€ã«ã«æžã蟌ãŸããæååã§ãã ã©ã€ãã©ãªã®SONAMEã¯ãããšãã°æ¬¡ã®ããã«è¡šç€ºã§ããŸãã
$ objdump -p /path/to/file | grep SONAME
fazããã°ã©ã /ã©ã€ãã©ãªãSONAME = baz-0.dllã®bazã©ã€ãã©ãªã«ãªã³ã¯ãããŠããå Žåã baz-0.dllè¡ã¯DT_NEEDEDã»ã¯ã·ã§ã³ã®ãã€ããªfazãã¡ã€ã«ã«ããŒãã³ãŒããããéå§æã«ãã€ãããã¯ããŒããŒã¯bazãšããååã®ãã¡ã€ã«ãæ¢ããŸãã -0.dll ãã®å Žåããã¡ã€ã«ã«ç°ãªãååãä»ããããšã誰ãçŠæ¢ããŠããŸããïŒ
å®è¡å¯èœãã¡ã€ã«ãäŸåããSONAMEã衚瀺ã§ããŸãã
$ objdump -x /path/to/file | grep NEEDED
ãã€ãããã¯ããŒããŒã¯ã次ã®å Žæã§DT_NEEDEDã»ã¯ã·ã§ã³ãããã®é åºã§ã©ã€ãã©ãªãæ€çŽ¢ããŸã [4] [5] ïŒ
- DT_RPATHã»ã¯ã·ã§ã³ã®ãã£ã¬ã¯ããªã®ãªã¹ããå®è¡å¯èœãã¡ã€ã«ã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸãã ã»ãšãã©ã®* nixã·ã¹ãã ã§ãµããŒããããŠããŸãã ã»ã¯ã·ã§ã³DT_RUNPATHãååšããå Žåã¯ç¡èŠãããŸãã
- LD_LIBRARY_PATH-ç°å¢å€æ°ããã£ã¬ã¯ããªã®ãªã¹ããå«ãŸããŠããŸãã
- DT_RUNPATH-DT_RPATHãšåããLD_LIBRARY_PATHã®åŸã«ã®ã¿è¡šç€ºãããŸãã ææ°ã®Unixã©ã€ã¯ã·ã¹ãã ã§ã®ã¿ãµããŒããããŠããŸãã
- /etc/ld.so.conf-ãã€ãããã¯ããŒããŒld.soã®æ§æãã¡ã€ã«ãã©ã€ãã©ãªã®ãããã©ã«ããŒã®ãªã¹ããå«ãŸããŠããŸãã
- ããŒãã¯ã€ã€ãŒããã¹-éåžž/ libããã³/ usr / libã
RPATHãLD_LIBRARY_PATHãããã³RUNPATHã®ããŒã¿åœ¢åŒã¯ãPATHã®å Žåãšåãã§ãïŒã³ãã³ã§åºåããããã¹ã®ãªã¹ãã ããšãã°ã次ã®ããã«RUNPATHã衚瀺ã§ããŸãã
$ objdump -x /path/to/file | egrep 'R(|UN)PATH'
R [UN] PATHã«ã¯ç¹å¥ãªã©ãã«$ ORIGINãå«ãŸããŠããå ŽåããããŸããããã¯ããã€ãããã¯ããŒããŒãããŒãããããšã³ãã£ãã£ãžã®å®å šãªçµ¶å¯Ÿãã¹ã«å±éããŸãã ããã§ã¯ãäžéšã®éçºè ãRUNPATHã«ãããïŒæéïŒãè¿œå ããããšã«æ³šæããŠãã ããã ããã¯$ ORIGINãšåãã§ã¯ãããŸããïŒ ãã€ã³ãã¯çŸåšã®äœæ¥ãã£ã¬ã¯ããªã«å±éãããæ¬è³ªãžã®ãã¹ãšèªç¶ã«äžèŽããå¿ èŠã¯ãããŸããïŒ
æžãããŠããå 容ã瀺ãããã«ã pã1ã®ã¹ããŒã ïŒgithubã®ã¹ãã¬ãŒãžãžã®ãªã³ã¯ïŒ github.com/gshep/linking-sample ïŒã«åŸã£ãŠã¢ããªã±ãŒã·ã§ã³ãéçºããŸãã ã·ã¹ãã å šäœãæ§ç¯ããã«ã¯ããã©ã«ããŒã®ã«ãŒãã«ç§»åããŠ
./linux_make_good.sh
ãåŒã³åºã
./linux_make_good.sh
ã§ãçµæã¯
result
ãã©ã«ããŒã«
./linux_make_good.sh
ãããŸãã ããã€ãã®çµã¿ç«ãŠæé ã以äžã§èª¬æããŸãã
ããŒãžã§ã³-0.xã©ã€ãã©ãªããªã³ã¯ãã段éã§ãSONAMEãèšå®ãããŸãïŒ
$ gcc -shared -Wl,-soname,version-0.3.dll -o version-0.3.dll version.o
ã·ã¹ãã ã©ã€ãã©ãªã®ã¿ã«äŸåãããããR [UN] PATHã»ã¯ã·ã§ã³ã¯äžèŠã§ãã
barã©ã€ãã©ãªã¯ãã§ã«ããŒãžã§ã³0.2ã«äŸåããŠãããããRPATHãæå®ããå¿ èŠããããŸãã
$ gcc -shared -Wl,-rpath-link,/path/to/version-0.2/ -L/path/to/version-0.2/ -l:version-0.2.dll -Wl,-rpath,\$ORIGIN/ -Wl,--enable-new-dtags -Wl,-soname,bar.dll -o bar.dll bar.o
--enable-new-dtags
ã¯ãDT_RUNPATHã»ã¯ã·ã§ã³ã«å ¥åãããããªã³ã«ãŒã«æ瀺ããŸãã
-Wl,-rpath,...
ã¯ãR [UN] PATHã»ã¯ã·ã§ã³ãåã
-Wl,-rpath,...
ã ãã¹ã®ãªã¹ããæå®ããã«ã¯ããã©ã¡ãŒã¿ãŒãè€æ°åæå®ããããã³ãã³ã§ãã¹ãŠã®ãã¹ããªã¹ãããŸãã
$ gcc -Wl,-rpath,/path/1/ -Wl,-rpath,/path/2 ... $ gcc -Wl,-rpath,/path/1:/path/2 ...
ããã§ãçµæãã©ã«ããŒã®ãã¹ãŠã®ã³ã³ãã³ããŸãã¯ãã©ã«ããŒå šäœããã¡ã€ã«ã·ã¹ãã å ã§èªç±ã«ç§»åã§ããŸããããã€ãããã¯ããŒããŒãèµ·åãããšãã¹ãŠã®äŸåé¢ä¿ãæ€åºãããããã°ã©ã ãå®è¡ãããŸãã
$ ./result/main.exe Hello World! bar library uses libversion 0.3.0, number = 3 version::get_version result = 0 But I uses liversion 0.3.0 number = 3
ããã§ããã£ã©ã¯ã¿ãŒãããã·ã¥ããåé¡ã«åãæãããŸãïŒ ããŒã¯ãget_numberïŒïŒã2ãè¿ãversion-0.2.dllãšãåãé¢æ°ãæ¢ã«3ãè¿ãã¢ããªã±ãŒã·ã§ã³version-0.3.dllã䜿çšããŸããã¢ããªã±ãŒã·ã§ã³ã®åºåã«ãããšãget_numberé¢æ°ã®1ã€ã®ããŒãžã§ã³ã¯å¥ã®ããŒãžã§ã³ã«ãã£ãŠäžæžããããŸãã
äºå®ã¯ [6; åçãªã³ã¯ãšèªã¿èŸŒã¿ãåçãªã³ã¯ã®ã¢ãããŒãã®æ¯èŒ] GNU ldïŒELFã¯ã€ã³ããŒããããæåã®åå空éãšããŠSONAMEãŸãã¯ãã¡ã€ã«åã䜿çšããŸããïŒ
ç°ãªãã©ã€ãã©ãªãåãååã®ãšã³ãã£ãã£ããšã¯ã¹ããŒããããšããããã®ããã€ãã¯ä»ã®ãã®ãç²ç ããæè¯ã®å Žåã¯ããã°ã©ã ãã¯ã©ãã·ã¥ããŸãã
ã©ã€ãã©ãªã®1ã€ãéçã§ããå Žåã¯åçŽã«è§£æ±ºãããŸããéçã©ã€ãã©ãªã®ãã¹ãŠã®ã·ã³ãã«ãé衚瀺ã«ããå¿ èŠããããŸã [7ã2.2.2ã°ããŒãã«å¯èŠæ§ã®å®çŸ©] ã
æ®å¿µãªãããåçã©ã€ãã©ãªã®å Žåãäºæ ã¯ããã»ã©åçŽã§ã¯ãããŸããã GNU Linker / Loaderã«ã¯ãçŽæ¥ãã€ã³ãã£ã³ã°ãªã©ã®æ©èœããããŸãã [8] ã 誰ããã²ã³ãã§ãã®æ©äŒãèŠãŸãã [9]ãããããã¹ãŠãæ»ãã ããã§ãã ãã£ãŒãŒã«çæã§åœŒå¥³ã¯ [10] [11]ãããããœãªã¢ã«ã«èªèº«ã¯æ»ã«ãŸãã...
1ã€ã®ãªãã·ã§ã³ã¯ããã£ã©ã¯ã¿ãŒèªäœãããŒãžã§ã³ç®¡çããããšã§ã [7ã2.2.5ãšã¯ã¹ããŒããããã®äœ¿çš] ã ããã¯å®éã«ã¯ãã£ã©ã¯ã¿ãŒã食ããããªãã®ã§ãã ïŒC ++ã§ããã°ã©ãã³ã°ããŠãããªãŒããŒãä»å«ãã§ãããã®ããæ³åã§ããªã...ïŒ
ãã®æ¹æ³ã¯ããã¹ãŠã®ãšã¯ã¹ããŒãããã³é衚瀺ã®ãšã³ãã£ãã£ããªã¹ããããããããããŒãžã§ã³ç®¡çãããã¹ã¯ãªãããäœæããããšããæããŸã [12] [13] ã ããŒãžã§ã³0.3ã®ã¹ã¯ãªããã®äŸïŒ
VERSION_0.3 { ã°ããŒãã«ïŒ get_version; get_version2; get_number; ããŒã«ã«ïŒ *; };
ãã«ã段éã§ã
--version-script=/path/to/version.script
ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã®ãã¡ã€ã«ãæå®ããŸãã ãã®åŸããã®ãããªlibã«é¢é£ä»ããããã¢ããªã±ãŒã·ã§ã³ã¯ãNEEDEDã®version-0.3.dllãšãã€ã³ããŒãããŒãã«ã®æªå®çŸ©æå
get_number@@VERSION_0.3
ã
get_number@@VERSION_0.3
ãŸãããint get_numberïŒïŒã¯ãŸã ããããŒãã¡ã€ã«ã«ãããŸãã
glibcã䜿çšããããã°ã©ã ã§nmãèšå®ãããšãæ確ã«è¡šç€ºãããŸãïŒ
ããŒãžã§ã³-0.xã©ã€ãã©ãªãŒã®ããŒãžã§ã³ç®¡çæåã䜿çšããŠäŸããã«ãããã«ã¯ã
use_version_script
ãã©ã¡ãŒã¿ãŒãæå®ããŠ
use_version_script
ã«ãŒãã¹ã¯ãªãããå®è¡ããŸãã
$ ./linux_make_good.sh use_version_script $ ./result/main.exe Hello World! bar library uses libversion 0.2.0, number = 2 version::get_version result = 0 But I uses liversion 0.3.0 number = 3 $ nm ./result/main.exe // ⊠U get_number@@VERSION_0.3 U get_version@@VERSION_0.3 0000000000401008 T main U memset@@GLIBC_2.2.5 $ nm ./result/bar.dll // ⊠U get_number@@VERSION_0.2 U get_version2@@VERSION_0.2 0000000000000800 t register_tm_clones U strcat@@GLIBC_2.2.5

- ã¡ãã£ãšããŒãïŒ libXã¯LinuxããµããŒãããŸãïŒ
- NoooooooooooooooooooooooooooooooooïŒ
ã¯ããç§ãã¡ã®ããŒã ãééããååæã®åŸãè¹é·ã¯åŒ·ãææ決å®ãäžããä»ã§ã¯1ã€ã®ããŒãžã§ã³ã®libã®ã¿ã䜿çšãããŠããŸãïŒæ£ç¢ºã«ã¯Linuxã®ããïŒã
Macã®ç¶æ³ã¯ã©ãã§ããïŒ
Mac Axisã¯ãå®è¡å¯èœãã¡ã€ã«ãããã³æåã®æ€çŽ¢ã«2ã¬ãã«ã®åå空éã®Mach-o圢åŒã䜿çšããŸã [14ã2ã¬ãã«ã®åå空é] [16] ã çŸåšã¯ãããããã©ã«ãã§ããããã©ãããªåå空éã§ãã«ãããããããã°ã©ã ã®èµ·åæã«å®å šã«ç¡å¹ã«ããããšãã§ããŸã [15ãFORCE_FLAT_NAMESPACE] ã ãã®ã³ãã³ãã¯ãåå空éããµããŒããããã€ããªãæ§ç¯ãããŠãããã©ããã確èªããã®ã«åœ¹ç«ã¡ãŸãã
$ otool -hv /path/to/binary/file
ã€ãŸããååã®è¿œå ã®è£ 食ã济ã³ãå¿ èŠã¯ãããŸãã-ãã¡ã€ã«åã«ããŒãžã§ã³ãå«ããã ãã§ãïŒ
ããããäŸåé¢ä¿ã®æ€çŽ¢ã¯ã©ãã§ããããïŒ
ãã³ã·ã§ã¯ãã»ãšãã©ãã¹ãŠã䌌ãŠããŸãããç°ãªãæ¹æ³ã§åŒã°ããŠããŸãã
SONAMEã®ä»£ããã«ãã©ã€ãã©ãªIDãŸãã¯ã€ã³ã¹ããŒã«åããããŸãã ããšãã°ã次ã®ããã«è¡šç€ºã§ããŸãã
install_name_toolã䜿çšããŠå€æŽã§ããŸãã$ otool -D /usr/lib/libstdc++.dylib
ã©ã€ãã©ãªã«ãªã³ã¯ããå Žåããã®IDã¯ãã€ããªã§æžã蟌ãŸããŸãã
ãã€ããªäŸåé¢ä¿ã¯æ¬¡ã®ããã«è¡šç€ºã§ããŸãã
ãŸãã¯$ otool -L /path/to/main.exe
$ dyldinfo -dylibs /path/to/main.exe
èµ·åæã«ãdyldã¯ãidããšããååã®ãã¡ã€ã«ãéãããšããŸã [15ãåçã©ã€ãã©ãªã®ããŒã] ãã€ãŸããã€ã³ã¹ããŒã«åãäŸåé¢ä¿ãžã®çµ¶å¯Ÿãã¹ãšèŠãªããŸãã 倱æããå Žåãç°å¢å€æ°DYLD_LIBRARY_PATHïŒLD_LIBRARY_PATHã®å®å šãªé¡äŒŒç©ïŒã«ãªã¹ããããŠãããã£ã¬ã¯ããªã§ãåå/ãµãã£ãã¯ã¹ "id"ãæã€ãã¡ã€ã«ãæ€çŽ¢ããŸãã
DYLD_LIBRARY_PATHã§ã®æ€çŽ¢ãçµæãè¿ããªãã£ãå Žåãdyldã¯åæ§ã«ããã«2ã3ã®ç°å¢å€æ°ã調ã¹ãŸã [15] ããã®åŸãæšæºã«ã¿ãã°ã§libãæ€çŽ¢ããŸãã
ãã®ã¹ããŒã ã§ã¯ãããŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ãåéã§ããŸããããã®ãããidïŒ@ executable_path /ã§èšè¿°ã§ããç¹å¥ãªã©ãã«ãå°å ¥ãããŸããã èµ·åæã®ãã®ããŒã¯ã¯ãå®è¡å¯èœãã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ã«å±éãããŸãã
次ã«ãå®æãããã€ããªã®äŸåé¢ä¿ãå€æŽã§ããŸãã
$ install_name_tool -change /usr/lib/libstdc++.dylib @executable_path/libstdc++.dylib main.exe
ããã§ãããŒããŒã¯ãŸãmain.exeãšåããã©ã«ããŒã§ãããæ€çŽ¢ããŸãã å®æãããã€ããªãå€æŽããªãããã«ããã«ã¯ãlibstdc ++ãDylib lib with id = @ executable_path / libstdc ++ããªã³ã¯äžã«Dylibãã¹ãªããããå¿ èŠããããŸãã
ããã«ã1ã€ããŸãã¯2ã€ã®åé¡ãçºçããŸãã ãã®ãããªéå±€ããããšããŸãïŒ
- main.bin
- ããŒã«/
- è£å©.bin
- library.dll
main.binã¯library.dllã«äŸåããŠããŸãããtools / auxiliary.binãããã«äŸåããŠããŸãã
åæã«ãid = @ executable_path / library.dllã§ãããäž¡æ¹ã®ãã€ããªãåã«ããã«ãªã³ã¯ãããŠããŸããã 次ã«ãauxiliary.binãèµ·åãããšãããŒãããŒããŒã¯/path/to/tools/library.dllãæ¢ããŸãããåœç¶ãããèŠã€ããããŸããïŒ ãã¡ããããªã³ã¯ããåŸã«ããŒã«ã§ããŒã«/auxiliary.binãä¿®æ£ãããããœãããªã³ã¯ãã¹ããŒããããšãã§ããŸããããã¯ãäžäŸ¿ã§ãïŒ
ããã«è¯ãããšã«ããã©ã°ã€ã³ã«é¢ããŠã¯åé¡ãçŸããŸãïŒ
- main.bin
- ãã©ã°ã€ã³/
- 1.ãã©ã°ã€ã³
- helper.dylib
1.pluginã«ã¯@ executable_path / helper.dylibãšãããšã³ããªããããŸãããèµ·åæã«ã¯1.pluginã§ã¯ãªãmain.binãžã®çµ¶å¯Ÿãã¹ã«å±éãããŸãïŒ
ãã®åé¡ã解決ããããã«ãAxis 10.4ã®Yablokoã¯æ°ããããŒã«ãŒ@ loader_path /ãå°å ¥ããŸããã äŸåé¢ä¿ã®èªã¿èŸŒã¿äžããã®ããŒã«ãŒã¯ãäŸåé¢ä¿ããã«ãããã€ããªãžã®çµ¶å¯Ÿãã¹ã«å±éãããŸãã
æåŸã®é£ç¹ã¯ããªã³ã¯ãããã©ã€ãã©ãªã®2ã€ã®ããŒãžã§ã³ãå¿ èŠãªããšã§ããäžéšã¯ã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããid = /usr/lib/libfoo.dylibã«ãªããŸããããã®ä»ã¯ãããžã§ã¯ãã®ãã«ãã«äœ¿çšãããid = @ loader_path / libfoo.dylibã«ãªããŸãã ããã¯install_name_toolã§ç°¡åã«è§£æ±ºã§ããŸãããé¢åã§ãã ãããã£ãŠãããŒãžã§ã³10.5ããã@ rpath /ã©ãã«ãå ¥åããŸããã ã©ã€ãã©ãªã¯id = @ rpath / libfoo.dylibã§æ§ç¯ãããã©ãã«ã§ãã³ããŒãããŸãã ãã€ããªã¯äŸåé¢ä¿ãæ¢ãããã®ãã¹ã®ãªã¹ãã䜿çšããŠã³ã³ãã€ã«ããã@ {executableãloader} _path /ãèš±å¯ãããŸãã
$ gcc ... -Xlinker -rpath -Xlinker '@executable_path/libs' -Xlinker -rpath -Xlinker '/usr/lib' ...
ããã¯ãELFã®RPATH / RUNPATHã«äŒŒãŠããŸãã ãã€ããªãèµ·åãããšãè¡@ rpath / libfoo.dylibã¯@ executable_path / libs / libfoo.dylibã«å±éãããŸãããããã¯ãã§ã«çµ¶å¯Ÿãã¹ã«å±éãããŠããŸãã ãŸãã¯ã/ usr / lib / libfoo.dylibã«ãããã€ããŸãã
次ã®ããã«ããã€ããªã«é ç·ãããrpathã衚瀺ã§ããŸãã
$ otool -l main.bin | grep -A 2 -i lc_rpath
install_name_toolã䜿çšããŠãrpathãåé€ãå€æŽããŸãã¯è¿œå ã§ããŸãã
äŸã§ç¢ºèªããŠãã ããïŒ
$ ./macosx_make_good.sh Building version-0.2 Building version-0.3 Building bar Building fooapp $ ./result/main.exe Hello World! bar library uses libversion 0.2.0, number = 2 version::get_version result = 0 But I uses liversion 0.3.0 number = 3
iOSã§ã¯ããã¹ãŠãåãã§ãã
ãã®äŸãããããããã«ãåçã©ã€ãã©ãªã®ç¹ã§Mac OS Xã¯LinuxïŒCoãããåªããŠããŸãã
ãããŠæåŸã«ãWindowsïŒ
ããã§ããã¹ãŠé 調ã§ã [6; åçãªã³ã¯ãšããŒããåçãªã³ã¯ã¢ãããŒãã®æ¯èŒ] ã ãã¡ã€ã«åã«ããŒãžã§ã³ãè¿œå ããã ãã§ãã·ã³ããªãã¯ãªã³ã¯ã¯äžèŠã§ãïŒ ã€ãŸãããããã¯ããã§ãããå€ãã®äººããããã«ã€ããŠæå¥ãèšããNTFSã§ã®ã¿åäœããŸã
Windowsã§ãµã³ãã«ããã«ãããã«ã¯ãç°å¢ãæ¢ã«æ§æãããŠããVisual Studioã³ã³ãœãŒã«ãå®è¡ããå¿ èŠããããŸãã ããã«çµã¿ç«ãŠãŠèµ·åããïŒ
> .\windows_make_good.bat // ... >.\result\main.exe Hello World! bar library uses libversion 0.2.0, number = 2 version::get_version result = 0 But I uses liversion 0.3.0 number = 3
ãªãŒãã¯æ±ããããŠããã ãã§ãã [17] ã äŸåé¢ä¿ã®æ€çŽ¢ã¢ã«ãŽãªãºã ãå€æŽãã1ã€ã®æ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³æ§æãã¡ã€ã«ãšãããŒãã®privatePathããããã£ã䜿çšããããšã§ã [18] ã ãã ãããã®æ¹æ³ã¯Windows 7 / Server 2008 R2以éã§ã®ã¿é©çšã§ããŸãã
ãããŠãWinSxSãšåŒã°ããã¢ã»ã³ããªïŒã¢ã»ã³ããªïŒããããŸã [19] ã ããã¯å¥ã®èšäºã®ãããã¯ã§ãã ãã ãããã®èšäºã®å·çäžã«ããããã®ã¢ã»ã³ããªã¯ïŒå°ãªããšãSishnikiãšC ++ã®ããã¯ããŒã ã®å Žåã®ã¿ïŒå¿ èŠã§ãããšããæŽå¯ãšç解ã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãcomdlg32.dllãªã©ãšãªã³ã¯ããŠãããããã¹ãŠç°ãªãããŒãžã§ã³ã䜿çšããŠããããšã確èªããããã«æžå°ããŸããã
ãããã«
ãã¹ãŠã®äž»èŠãªãã©ãããã©ãŒã ã«ãããéåžžã®ã³ããŒã§ã€ã³ã¹ããŒã«ã§ããã¢ããªã±ãŒã·ã§ã³ãæ¯èŒçç°¡åã«äœæã§ããŸãã ãã ããéçºè ã¯ãäŸåé¢ä¿ã®å°çãäžäœäºææ§ãããã³ãã£ã©ã¯ã¿ãŒããã·ã³ã°ã®åé¡ãèªåã§è§£æ±ºããå¿ èŠããããŸãã
äž»ãªæ±ºå®ã¯ãæ£ããããŒãžã§ã³ç®¡çãéžæãããããå¶åŸ¡ããããšã§ãã
远䌞 ãã®èšäºã®äœæ¥äžãèè ã¯ãã¹ãã©ã€ãäžïŒãäŒè°ã«åºåžããããã§ã¯ããŒãžã§ã³ç®¡çã«é¢ããããã«ãºã»Kã»ãã¶ããã®å ±åã«è³ãåŸããŸããã [20] ã äºæããªãããšãçããããšããããŸããã§ãããããã®ãããªæåãªäŒç€Ÿãåé¡ãèªèããæ£ããçµè«ãäžãããšèããŠããããã£ãã§ãã èªåèªèº«ã®æ°ããèšäºãããèè ã¯ãããããªã³ã¯ãäœæããŸããïŒ semver.org ã
ãã®æ©äŒã«ãååã®ã¢ã¬ã¯ãµã³ããŒã»ã·ããããšã¢ã¬ã¯ãµã³ããŒã»ããã³ãã£ãšãã«å»ºèšçãªæ¹å€ãšè²Žéãªã³ã¡ã³ããããããšãããããŸãïŒ
åç §è³æ
- ^ QtMultimedia changes-5.0.1
- ^ http://en.wikipedia.org/wiki/Soname
- ^ããã°ã©ã ã©ã€ãã©ãªHOWTOã 3.1.1ã å ±æã©ã€ãã©ãªå ã
- ^ man ld-linux.soã
- ^ http://en.wikipedia.org/wiki/Rpath
- ^ 1 2ãªã³ã«ãŒãšããŒããŒJohn R. Levineã httpïŒ//www.iecc.com/linker/ ã
- ^ 1 2 Ulrich Drepperã«ããå ±æã©ã€ãã©ãªã®æžãæ¹ã httpïŒ //www.akkadia.org/drepper/dsohowto.pdfïŒpdfïŒã
- ^ http://en.wikipedia.org/wiki/Direct_binding
- ^ https://bugs.gentoo.org/show_bug.cgi?id=114008
- ^ https://blogs.oracle.com/msw/date/20050614
- ^ http://cryptonector.com/2012/02/dll-hell-on-linux-but-not-solaris/
- ^ https://sourceware.org/binutils/docs/ld/VERSION.html
- ^ http://www.tux.org/pub/tux/eric/elf/docs/GNUvers.txt
- ^ç·ldã
- ^ 1 2 3人ã®åšã
- ^ http://en.wikipedia.org/wiki/Mach-O#Mach-O_file_layout
- ^ MSDNããã€ãããã¯ãªã³ã¯ã©ã€ãã©ãªã®æ€çŽ¢é åºã httpïŒ//msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx
- ^ http://stackoverflow.com/a/10390305/1758733
- ^ http://en.wikipedia.org/wiki/WinSXS
- ^ Nazarov K.ãããŒãžã§ã³ç®¡çãœãããŠã§ã¢è£œåã®éåžžã«åèŠã httpïŒ//nastachku.ru/lectures#lecture_178
- Oracleããªã³ã«ãŒããã³ã©ã€ãã©ãªã¬ã€ãã httpïŒ//docs.oracle.com/cd/E19683-01/817-1983/index.html
- ãªã³ã«ãŒã®åå¿è åãã¬ã€ãã httpïŒ//habrahabr.ru/post/150327/