Rcutils: find_library :`LD_LIBRARY_PATH` 검색보닀 ν˜„μž¬λ‘œλ“œ 된 라이브러리λ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 03μ›” 25일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: ros2/rcutils

ν˜„μž¬ find_library λ‘œλ“œ 된 라이브러리λ₯Ό λ¨Όμ € μΏΌλ¦¬ν•˜λŠ” λŒ€μ‹  LD_LIBRARY_PATH 따라 라이브러리 κ²€μƒ‰μœΌλ‘œ λ°”λ‘œ λ–¨μ–΄μ§‘λ‹ˆλ‹€. ν˜„μž¬ 3 가지 κ΅¬ν˜„ 쀑 ν•˜λ‚˜ :
https://github.com/ros2/rmw_implementation/blob/32c3de1/rmw_implementation/src/functions.cpp#L77

이 μ½”λ“œκ°€ ν˜„μž¬λ‘œλ“œ 된 라이브러리λ₯Ό μ„ ν˜Έν•˜κ³ , λŸ°νƒ€μž„μ— DDS κ΅¬ν˜„ (예 : μž¬ν˜„ 사둀 λ‹¨μˆœν™” λ“±)을 μ „ν™˜ν•˜λŠ” κΈ°λŠ₯을 μ›ν•˜μ§€ μ•ŠλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό μ§€μ›ν•˜κ³  λŒ€μ‹  RPATHκ°€ μ μ ˆν•œ 라이브러리λ₯Ό λ§ν¬ν•˜λŠ” 것이 쒋을 κ²ƒμž…λ‹ˆλ‹€.

help wanted

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

흠, μ‹œμž‘ν•˜λŠ” 데 rcpputils::find_library_path() 이 ν•„μš”ν•œ μ΄μœ κ°€ κΆκΈˆν•©λ‹ˆλ‹€. λ‹¨μˆœνžˆ rcutils_load_shared_library() λ˜λŠ” rcpputils::SharedLibrary λž˜νΌμ— μƒλŒ€ 경둜λ₯Ό μ œκ³΅ν•˜λ©΄ dlopen 및 LoadLibrary κ°€ 경둜λ₯Ό κ²€μƒ‰ν•˜κ³ λ‘œλ“œ 된 개체 νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. λ‘˜ 닀에 λŒ€ν•œ λ¬Έμ„œμ— λ”°λ₯΄λ©΄ μ΄λ―Έλ‘œλ“œ 된 개체 νŒŒμΌμ€ λ‹€μ‹œ κ°€μ Έ μ˜€μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ©΄ RPATH, LD_LIBRARY_PATH, RUNPATH, PATH 및 μ‚¬μ „λ‘œλ“œ 된 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 기본적으둜 μ μš©λ©λ‹ˆλ‹€.

CC @ EricCousineau-TRI @wieset @clalancette.

λͺ¨λ“  22 λŒ“κΈ€

λ‹€μŒμ€ Linuxμ—μ„œ μž‘λ™ν•˜λŠ” ν”„λ‘œν†  νƒ€μž…μž…λ‹ˆλ‹€.
https://github.com/EricCousineau-TRI/rcpputils/commit/b66a3d9e02ace44e6c3b6022eeb3447b121d3311

Drake μΆœμ²˜μ—μ„œ Cribbing :
https://github.com/RobotLocomotion/drake/blob/4c6246197/common/find_loaded_library.cc

이 Bazel μž¬ν˜„ ν”„λ‘œμ νŠΈμ— λŒ€ν•œμ΄ μ»€λ°‹μ—μ„œ 이제 λ§ν¬μ‹œ RMW κ΅¬ν˜„μ„ μ§€μ •ν•˜κ±°λ‚˜ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ—°κΈ° ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
https://github.com/EricCousineau-TRI/repro/commit/cea11026722b340580257564dc49cb0f59b55178

@ dirk-thomas λ‚˜λŠ” 이것이 맀우 μœ μš©ν•˜λ‹€κ³ 

당신이 이것을 κ³ λ €ν•˜λ„λ‘ μ–΄λ–€ (μžˆλŠ” 경우) 증거가 μžˆλŠ”μ§€ 물어봐도 λ κΉŒμš”?

배포판의 λͺ©ν‘œλŠ” μ•ˆμ •μ„± λ°± ν¬νŠΈκ°€ 버그 μˆ˜μ • μ „μš©μž„μ„ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν–₯μƒλœ κΈ°λŠ₯은 λ‹€μŒ λ°°ν¬νŒμ„ λŒ€μƒμœΌλ‘œν•΄μ•Όν•©λ‹ˆλ‹€.

Dashing의 첫 번째 ν…ŒμŠ€νŠΈ νŒ¨ν‚€μ§€λŠ” 4 μ›” 첫째 주에 제곡 될 μ˜ˆμ •μž…λ‹ˆλ‹€.

예, 쒋은 것 κ°™μŠ΅λ‹ˆλ‹€. https://github.com/ros2/rcpputils/issues/3 의 병합을

setcap λ₯Ό 톡해 μ„€μ •λœ κΈ°λŠ₯이 ν•„μš”ν•œ ros2 λ…Έλ“œκ°€μžˆμ–΄ μ‹€ν–‰ 쀑에 LD_LIBRARY_PATH 이 μƒλž΅λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ μš°λ¦¬λŠ” 곡유 라이브러리λ₯Ό μ°ΎκΈ° μœ„ν•΄ λ°”μ΄λ„ˆλ¦¬μ—μ„œ RPATH λ₯Ό μ„€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ find_library_path λŠ” LD_LIBRARY_PATH 에 μ˜μ‘΄ν•˜λ―€λ‘œ λ…Έλ“œλŠ”

terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
  what():  failed to initialized rcl init options: failed to find shared library of rmw implementation. Searched rmw_fastrtps_cpp, at /tmp/binarydeb/ros-eloquent-rmw-implementation-0.8.2/src/functions.cpp:130, at /tmp/binarydeb/ros-eloquent-rcl-0.8.3/src/rcl/init_options.c:55

λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•œλ‹€λ©΄ @ EricCousineau-TRI의 μ œμ•ˆμ΄μ΄ 문제λ₯Ό ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€. λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œμ΄ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ˜λŠ” ν•΄κ²° 방법에 λŒ€ν•œ μ œμ•ˆ 사항이 μžˆμŠ΅λ‹ˆκΉŒ?

@ EricCousineau-TRI에 λŒ€ν•΄ 반볡 ν•  κ³„νšμž…λ‹ˆκΉŒ?

λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•œλ‹€λ©΄ @ EricCousineau-TRI의 μ œμ•ˆμ΄μ΄ 문제λ₯Ό ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€.

@wieset 찾으렀고 /λ‘œλ“œν•˜λ €λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ•„μ§λ‘œλ“œλ˜μ§€ μ•Šμ€ 경우 μ–΄λ–»κ²Œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@ivanpauno μ•„λ§ˆ κ°€κΉŒμš΄ μž₯λž˜μ— (~ 6 κ°œμ›”μ—μ„œ 1 λ…„) μ•ˆνƒ€κΉκ²Œλ„ :(

@ dirk-thomas @ EricCousineau-TRI의 예제 μ½”λ“œλ₯Ό λ³΄μ•˜κ³  당신이 λ§žμŠ΅λ‹ˆλ‹€. λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ•„μ§λ‘œλ“œλ˜μ§€ μ•Šμ€ 경우 λ‚΄ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œλ‘œλ“œλ˜λ„λ‘ λΉŒλ“œ ν•  λ•Œ 링크 ν•  수 μžˆμ„κΉŒμš”?

κ·ΈλŸ¬λ‚˜ λŸ°νƒ€μž„μ—λ‘œλ“œλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ 두 가지 μ˜΅μ…˜μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. RPATH λ₯Ό κ²€μƒ‰ν•΄μ•Όν•©λ‹ˆλ‹€. CMAKE_INSTALL_RPATH 톡해 μ„€μ •ν•  수 μžˆκ±°λ‚˜ LD_LIBRARY_PATH λŒ€μ‹  λ‹€λ₯Έ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ RMW_LIBRARY_PATH . https://github.com/ros2/rcpputils/issues/40 μ—μ„œ 두 μ˜΅μ…˜μ„ λͺ¨λ‘ μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€

@wieset 이 μ‚¬μš© 사둀에 rpathλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λΉŒλ“œλ₯Ό μ‚¬μš©μž μ§€μ •ν•˜λŠ” 것은 λ°©λ²•μ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€.

@ dirk-thomas λ™μ˜ν•˜κ³  이미 RPATH 을 (λ₯Ό) μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“  라이브러리λ₯Όλ‘œλ“œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 rmw λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ find_library_path() κ°€ ν˜„μž¬ κ±°κΈ°μ—μ„œ 보이지 μ•ŠλŠ”λ‹€λŠ” 사싀을 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ λ‚΄κ°€ λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

κ·ΈλŸ¬λ‚˜ 그것은 rtw λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ find_library_path() κ°€ ν˜„μž¬ κ±°κΈ°μ—μ„œ 보이지 μ•ŠλŠ”λ‹€λŠ” 사싀을 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

당신이 μ˜³μŠ΅λ‹ˆλ‹€. 이 ν‹°μΌ“μ˜ λ‚΄μš©μ„ λ†“μ³€μŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ λ³„λ„μ˜ ν™˜κ²½ λ³€μˆ˜λ₯Ό λ„μž…ν•˜λŠ” 것이 합리적 일지 λ˜λŠ” κΈ°μ‘΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό λͺ…μ‹œ 적으둜 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‹€ν–‰ νŒŒμΌμ„ 루트둜 μ‹€ν–‰ν•  λ•Œ ν™•μΈν•΄μ•Όν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

λ‚΄κ°€ μ•„λŠ” ν•œ LD_LIBRARY_PATH λŠ” setcap / setuid μ‹€ν–‰ νŒŒμΌμ— λŒ€ν•΄ μ™„μ „νžˆ λ¬΄μ‹œλ˜λ―€λ‘œ 직접 섀정해도 λ„μ›€μ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. http://man7.org/linux/man-pages/man8/ld.so.8.html μ°Έμ‘°

λ³΄μ•ˆ μ œν•œμ„ μš°νšŒν•˜κΈ° μœ„ν•΄ ROS_LIBRARY_PATH 와 같은 μƒˆλ‘œμš΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό λ„μž…ν•˜λŠ” 것이 쒋은 생각인지 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ld λŠ” 그것에 λŒ€ν•΄ μ•Œμ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— ν•„ν„°λ§ν•˜μ§€ μ•ŠμœΌλ©° λ³΄μ•ˆ κ³ λ € μ‚¬ν•­μœΌλ‘œ 인해 LD_LIBRARY_PATH λ¬΄μ‹œν•©λ‹ˆλ‹€.

이 κ°œμ„  사항을 μΆ”κ°€ ν•  PR을 자유둭게 μ œμ•ˆν•˜μ‹­μ‹œμ˜€ ( "지원 ν•„μš”"λ ˆμ΄λΈ”λ‘œ ν‘œμ‹œλ¨).

그것을 쑰사 ν•  κ²ƒμž…λ‹ˆλ‹€!

https://github.com/ros2/rcpputils/pull/44 μ—μ„œ pull μš”μ²­μ„ μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

FWIW @hidmic , @iantheengineer , 그리고 μ €λŠ” TRI의 λ‹€λ₯Έ μ‚¬λžŒλ“€κ³Ό 이것을 λ…Όμ˜ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € λ‚΄λΆ€ μš©λ„λ‘œ μ‚¬μš© 된 λ‹€μŒ Drake 와 같은 κ²ƒλ“€κ³Όμ˜ ν†΅ν•©μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

흠, μ‹œμž‘ν•˜λŠ” 데 rcpputils::find_library_path() 이 ν•„μš”ν•œ μ΄μœ κ°€ κΆκΈˆν•©λ‹ˆλ‹€. λ‹¨μˆœνžˆ rcutils_load_shared_library() λ˜λŠ” rcpputils::SharedLibrary λž˜νΌμ— μƒλŒ€ 경둜λ₯Ό μ œκ³΅ν•˜λ©΄ dlopen 및 LoadLibrary κ°€ 경둜λ₯Ό κ²€μƒ‰ν•˜κ³ λ‘œλ“œ 된 개체 νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. λ‘˜ 닀에 λŒ€ν•œ λ¬Έμ„œμ— λ”°λ₯΄λ©΄ μ΄λ―Έλ‘œλ“œ 된 개체 νŒŒμΌμ€ λ‹€μ‹œ κ°€μ Έ μ˜€μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ©΄ RPATH, LD_LIBRARY_PATH, RUNPATH, PATH 및 μ‚¬μ „λ‘œλ“œ 된 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 기본적으둜 μ μš©λ©λ‹ˆλ‹€.

CC @ EricCousineau-TRI @wieset @clalancette.

μ’‹μ•„, 이것에 λŒ€ν•œ 첫 번째 찌λ₯΄κΈ° μœ„ν•΄ # 320 및 μ—°κ²°λœ PR을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. @wieset 은 (κ°„μ ‘μ μœΌλ‘œ) λ¬Έμ œλ„ ν•΄κ²°ν•΄μ•Όν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ³€κ²½μœΌλ‘œ 인해 rcpputils::find_library_path 은 (λŠ”) μ“Έλͺ¨ μ—†κ²Œλ©λ‹ˆλ‹€ (μ½”μ–΄ νŒ¨ν‚€μ§€μ—μ„œ μ‚¬μš©).

@hidmic 이제 320 번과 μΉœκ΅¬λ“€μ΄ 도착 ν–ˆμœΌλ‹ˆ 이걸 닫아도 λ κΉŒμš”?

μ‹€μ œλ‘œ μš°λ¦¬λŠ” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 범프에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

@hidmic 정말 κ°μ‚¬ν•©λ‹ˆλ‹€. RUNPATH 은 (λŠ”) μ—¬μ „νžˆ μ œλŒ€λ‘œ μ±„μ›Œ μ Έμ•Όν•©λ‹ˆλ‹€. https://github.com/ros2/rcpputils/pull/44 μ—μ„œ @clalancette 와 토둠을 κ³„μ†ν•˜κ² μŠ΅λ‹ˆλ‹€ .

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰