Study: ComputerScience(CS)/CS: Linux

[Linux] ๋ฆฌ๋ˆ…์Šค *.so.* ํŒŒ์ผ ๊ฒฝ๋กœ: ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํ‚นํ•˜๋Š” ๋ฐฉ๋ฒ• (feat. ์ •์ (static) vs ๋™์ (dynamic))

DrawingProcess 2022. 7. 23. 13:24
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” '๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํ‚นํ•˜๋Š” ๋ฐฉ๋ฒ•'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
๋ฆฌ๋ˆ…์Šค์—์„œ ๊ฐ„ํ˜น ์–ด๋– ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ๋•Œ, ๋ฌด์Šจ๋ฌด์Šจ so ํŒŒ์ผ(*.so), ๊ฐ€๋ น libX11.so.6 ํŒŒ์ผ(*.so.*)์ด ์—†๋‹ค๊ณ  ํ•  ๋•Œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐœ๋… ๋ฐ ์›์ธ๊ณผ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1.1 ์ •์  VS ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ: ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ๋•Œ ์‹คํ–‰ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
    • ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ,
    • ์‹คํ–‰ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ๋‹นํžˆ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ: ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ ๋ถ€๋ถ„์„ ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ์•„๋†“๊ณ  ๋ช…๋ น์–ด์™€ ๋งํฌ๋ฅผ ๊ฑธ์–ด๋‘ก๋‹ˆ๋‹ค.
    • ์ดํ›„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ(๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ์žˆ๋Š” ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
      • ๋”ฐ๋ผ์„œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด๋‹ค๋Š” ๋””์Šคํฌ์˜ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๋ฉฐ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
      • ์ด๋Ÿฌํ•œ ์  ๋•Œ๋ฌธ์— ์šด์˜์ฒด์ œ์—์„œ๋Š” ๋™์  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1.2 ๋™์  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€?

ํ”„๋กœ๊ทธ๋žจ๋“ค์˜ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„๋“ค์„ ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ชจ์•„ '๋™์  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ'๋ผ ํ•ฉ๋‹ˆ๋‹ค.

1.2.1 ์˜์กด์„ฑ

  • ๋™์ ์œผ๋กœ ๋งํฌ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์ผ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ํ•˜๋‹จ์—์„œ ์–ธ๊ธ‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค!).
  • ex) GNOME ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ GTK+๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

1.2.2 ๋งํฌ

  • ๋™์  ๋งํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ์‹คํ–‰ํŒŒ์ผ๊ณผ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŒŒ์ผ์€ ld.so ์— ์˜ํ•ด ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค.
  • ld.so ๋Š” ๋ง์ปค ์—ญํ• ์„ ํ•˜๋ฉด์„œ  ์‹คํ–‰ํŒŒ์ผ์„ ์ ๊ฒ€ํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ld.so ๊ฐ€ ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

1.3 ๋™์  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ ๋””๋ ‰ํ„ฐ๋ฆฌ

  • ๋ฆฌ๋ˆ…์Šค ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณต์œ ๋ฌผ(shared object) ๋ผ๋Š” ์˜๋ฏธ๋กœ ํŒŒ์ผ๋ช… ๋’ค์— .so ๊ฐ€ ๋ถ™๋Š”๋‹ค(*.dll์ด ๋ถ™๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค).
  • ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋“ค์˜ ์œ„์น˜๋Š” ๋Œ€๋ถ€๋ถ„ /lib64 ์™€ /usr/lib ์— ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.
    • /lib, /lib64 = cp๋‚˜ mv ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ช…๋ น์–ด ๋ฐ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๊ด€๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • /usr/lib = ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋˜ํ•œ /lib64, /usr/lib ์ด์™ธ์— ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ld.so.conf ๋‚˜ ld.so.cache ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • /etc/ld.so.cache = ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๋ชฉ๋ก์ •๋ณด
      • /lib, /usr/lib ํŒŒ์ผ์ด๋‚˜ ํ™˜๊ฒฝ์„ค์ •(ld.so.conf)ํŒŒ์ผ์— ๋“ฑ๋ก๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๋ชฉ๋ก์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • /etc/ld.so.conf = ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ณต์œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋“ฑ๋ก
      • ld.so.conf ํŒŒ์ผ: ๊ธฐ๋ณธ์ ์ธ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ ํŒŒ์ผ์„ ๋“ฑ๋กํ•  ๋•Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ž‘์„ฑํ•ด์„œ ldconfig ๋ช…๋ น์œผ๋กœ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์„ค์ •๋œ /etc/ld.so.conf ํŒŒ์ผ์„ ์ˆ˜์ • ํ›„ ๊ฐฑ์‹ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ์˜ต์…˜ ์—†์ด ldconfig ๋ช…๋ น๋งŒ ์ž…๋ ฅํ•ด๋„ ๋‚ด์šฉ์ด ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

2. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ(*.so, *.dll)

2.1 *.so ํŒŒ์ผ์ด๋ž€?

  • so ํŒŒ์ผ์€ shared object ํŒŒ์ผ์ด๋ž€ ๋œป์œผ๋กœ ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋†“์€ ํŒŒ์ผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ ํ•˜๋”๋ผ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ so ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด์„œ ์ด๋ฃจ์–ด ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2.2 ๊ทธ๋ ‡๋‹ค๋ฉด *.so ํŒŒ์ผ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ(์—ฐ๊ฒฐ)ํ• ๊นŒ?

๋งŒ์•ฝ ๋‚ด๊ฐ€ ์„ค์น˜ํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ํŠน์ • ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ์–ด๋–ค so ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•  ๋•Œ, ์–ด๋–ค ๊ฒฝ์šฐ๋Š” ์„ค์น˜์‹œ so ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฑฐ๋‚˜, ์–ด๋–ค ๊ฒฝ์šฐ๋Š” ์„ค์น˜๋œ ์ดํ›„ ์‹ค์ œ so ํŒŒ์ผ์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ทธ so ํŒŒ์ผ์„ ์ฐพ๋‹ค๊ฐ€ ์—†์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

libstdc++.so.5: cannot open shared object file: No such file or directory
libgcc_s.so.1: cannot open shared object file: No such file or directory
  • ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ so ํŒŒ์ผ์„ ์–ด๋””์—์„œ ์ฐพ์•„์•ผ ํ•˜๋Š”์ง€๋ฅผ ์„ค์ •ํ•ด ๋†“์€ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ์ฐพ์•„ ๋ณด์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  libstdc++.so.5 ์™€ libgcc_s.so.1 ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ์ € ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ์–ด๋”˜๊ฐ€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ฌ์ง€์–ด ํ˜„์žฌ ๊ฒฝ๋กœ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ฒด ์™œ ์ €๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์„๊นŒ ์˜์•„ํ•ด ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, so ํŒŒ์ผ์€ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ฐพ๊ธฐ์— ํ•ด๋‹น ๊ฒฝ๋กœ์—์„œ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด  ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

2.3 ํŠน์ • ์‹คํ–‰ํŒŒ์ผ์— ์‚ฌ์šฉ๋˜๋Š” *.so ํŒŒ์ผ๋Š” ์–ด๋–ป๊ฒŒ ํ™•์ธํ• ๊นŒ?

$ ldd ./bin/MbrGen
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f54939be000)
libstdc++.so.5 => not found
libgcc_s.so.1 => not found
  • ํŠน์ • ํŒŒ์ผ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์— ๋งํฌ๋˜๊ฑฐ๋‚˜ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • ์ด๋•Œ,
    • libc.so.6์˜ ๊ฒฝ์šฐ: ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์ฐพ์•˜์ง€๋งŒ,
    • libstdc++.so.5, libgcc_s.so.1์˜ ๊ฒฝ์šฐ: ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ํŠน์ • ํŒŒ์ผ์— ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ๋งํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

2.4 *.so ํŒŒ์ผ์€ ์–ด๋””์— ์žˆ์„๊นŒ? ๋งํ‚นํ•˜๋ ค๋ฉด ๊ฒฝ๋กœ๋ฅผ ์•Œ์•„์•ผ ํ• ํ…๋ฐ..

$ locate libstdc++.so.5 | more

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์›ํ•˜๋Š” so ํŒŒ์ผ์„ ์ฐพ์•˜์œผ๋ฉด *.so ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ link ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•˜๋‹จ์—์„œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3. *.so ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ •

3.1 *.so ํŒŒ์ผ์„ ์ฐพ๋Š” ์ˆœ์„œ

  1. LD_LIBRARY_PATH
  2. system default ๊ฒฝ๋กœ
  3. /lib
  4. /usr/lib

3.2 *.so ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ • ๋ฐฉ๋ฒ•

  1. LD_LIBRARY_PATH
  2. system default ๊ฒฝ๋กœ
  3. binary code ์— hard-coding ๋œ ๊ฒฝ๋กœ

3.3 *.so ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ • ์ƒ์„ธ ๋ฐฉ๋ฒ•

3.3.1 LD_LIBRARY_PATH

LD_LIBRARY_PATH๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ์–ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค.

$ env
$ env | grep LD_

$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/${USER}/gmbdsvr/MbrGen/AutocryptV2X/lib
$ export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

$ env | grep LD_
LD_LIBRARY_PATH=:/home/sjchoi/gmbdsvr/MbrGen/AutocryptV2X/lib
  • env | grep LD_: 'LD_'๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„์ค๋‹ˆ๋‹ค.
    • ์ฒ˜์Œ ์ฐพ์•˜์„ ๋•Œ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, export๋กœ ์ง€์ •ํ•ด์ค€ ํ›„ ํ™•์ธํ•˜๋ฉด ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ง€์ •ํ•ด์ค„ ๊ฒฝ์šฐ ํ„ฐ๋ฏธ๋„์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ถ€ํŒ…ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด์•ผํ•˜๊ธฐ์—, ~/.bash_profile๊ณผ ๊ฐ™์ด bash shell์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ณณ์— ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
$ nano ~/.bash_profile
...
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/sjchoi/lib

// ์ˆ˜์ •ํ•œ .bash_profile ํŒŒ์ผ์„ ์ ์šฉ
$ source ~/.bash_profile

 

3.3.2 system default ๊ฒฝ๋กœ feat. /etc/ld.so.conf

$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
  • ์ผ๋ฐ˜์ ์œผ๋กœ system default ๊ฒฝ๋กœ๋Š” /usr/local/bin ๊ณผ /usr/bin ์ด๋ฉฐ, ์ด ๊ฐ’์€ /etc/ld.so.conf ํŒŒ์ผ์— ์„ค์ •์ด ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, /etc/ld.so.conf ํŒŒ์ผ์— ์„ค์ •๋œ ๊ฒฝ๋กœ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„ ๊ฐ€๋ฉด์„œ ์›ํ•˜๋Š” so ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๊ทธ๊ฒƒ์„ ld.so.conf ์— ๋„ฃ๊ณ  ์‹ถ์œผ๋ฉด, /etc/ld.so.conf.d/ ๊ฒฝ๋กœ ๋ฐ‘์— *.conf ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ ํ›„ ๊ทธ ํŒŒ์ผ์— ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์ง‘์–ด ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
...

$ ls /etc/ld.so.conf/
libs.conf

$ cat /etc/ld.so.conf/libs.conf
/usr/local/lib

// ์œ„ conf๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด, ldconfig๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ ldconfig
  • include ๊ตฌ๋ฌธ์— ์˜ํ•ด ld.so.conf.d ์•ˆ์— ์žˆ๋Š” *.conf ํŒŒ์ผ์˜ ๋‚ด์šฉ๋“ค์ด ld.so.conf ํŒŒ์ผ์— ๋ชจ๋‘ ๋“ค์–ด ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์œ„ ํŒŒ์ผ์„ ์ˆ˜์ •์„ ํ–ˆ์œผ๋ฉด ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ldconfig ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

3.3.3 binary code์— hard-coding ๋œ ๊ฒฝ๋กœ

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•„์˜ˆ ์†Œ์Šค ์ฝ”๋“œ์— so ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  hard-coding์€ ์–ด๋–ค ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด๋“  ๊ถŒ์žฅํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

const char* lib_path[] = { "/home/adnoctum/test/libabcd.so.1.0", "/home/adnoctum/test/libabcc.so.1.0"};

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ ๊ฒฝ๋กœ์— so ํŒŒ์ผ์„ ๊ฐ€์ ธ๋‹ค ๋†“๋Š” ๊ฒƒ์ธ๋ฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ hard-coding ํ•œ ๊ฒฝ๋กœ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๋„๋ฌด์ง€ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์œ„์˜ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ.

  • /etd/ld.so.conf ํŒŒ์ผ์— ํŠน์ • so ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง‘์–ด ๋„ฃ๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด so ํŒŒ์ผ์„ /usr/local/bin ๊ณผ ๊ฐ™์€ ๊ณณ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ฑฐ๋‚˜ link ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
  • ์ด๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ so ํŒŒ์ผ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ํ•˜๋‚˜ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋งํฌ ๋งŒ๋“ค์–ด๋„ ๋˜ ๋‹ค๋ฅธ so ํŒŒ์ผ์—์„œ ๋™์ผํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ LD_LIBRARY_PATH ์— ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋ง๋ถ™์ด๊ฑฐ๋‚˜ ld.so.conf ํŒŒ์ผ์— ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์ง‘์–ด ๋„ฃ๋Š” ๊ฒƒ์ด ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฐ๋ฐ locate ๋กœ ํ–ˆ๋Š”๋ฐ ์ •๋ง๋กœ ์›ํ•˜๋Š” so ํŒŒ์ผ์ด ์—†๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ so ํŒŒ์ผ์ด ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š”์ง€, ๊ทธ๋ž˜์„œ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•