ເຂົ້າໃຈຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນໃນ Linux


ໃນການຂຽນໂປແກຼມ, ຫ້ອງສະມຸດແມ່ນການເລື່ອກສານຂອງລະຫັດທີ່ຖືກລວບລວມໄວ້ກ່ອນເຊິ່ງສາມາດ ນຳ ໃຊ້ຄືນ ໃໝ່ ໃນໂປແກຼມ. ຫ້ອງສະມຸດເຮັດໃຫ້ຊີວິດງ່າຍຂື້ນ ສຳ ລັບນັກຂຽນໂປແກຼມ, ໃນນັ້ນພວກເຂົາສະ ໜອງ ໜ້າ ທີ່ທີ່ສາມາດ ນຳ ໃຊ້ໄດ້, ປົກກະຕິ, ຫ້ອງຮຽນ, ໂຄງສ້າງຂໍ້ມູນແລະອື່ນໆ (ຂຽນໂດຍນັກຂຽນໂປແກຼມຄົນອື່ນ) ເຊິ່ງພວກເຂົາສາມາດ ນຳ ໃຊ້ເຂົ້າໃນໂປແກຼມຂອງພວກເຂົາ.

ຍົກຕົວຢ່າງ, ຖ້າທ່ານ ກຳ ລັງສ້າງແອັບພລິເຄຊັນທີ່ຕ້ອງການ ດຳ ເນີນການປະຕິບັດງານດ້ານຄະນິດສາດ, ທ່ານບໍ່ ຈຳ ເປັນຕ້ອງສ້າງ ຕຳ ລາຄະນິດສາດ ໃໝ່ ສຳ ລັບສິ່ງນັ້ນ, ທ່ານພຽງແຕ່ສາມາດໃຊ້ຟັງຊັນທີ່ມີຢູ່ໃນຫ້ອງສະ ໝຸດ ສຳ ລັບພາສາການຂຽນໂປແກຼມນັ້ນ.

ຕົວຢ່າງຂອງຫໍສະ ໝຸດ ໃນ Linux ລວມມີ libc (ຫ້ອງສະ ໝຸດ C ມາດຕະຖານ) ຫຼື glibc (ເວີຊັນ GNU ຂອງຫ້ອງສະ ໝຸດ ມາດຕະຖານ C), libcurl (ຫ້ອງສະ ໝຸດ ໂອນໄຟລ໌ທີ່ມີຫລາຍຮູບແບບ), libcrypt (ຫ້ອງສະ ໝຸດ ໃຊ້ ສຳ ລັບການເຂົ້າລະຫັດ, ການຫຍໍ້ແລະການເຂົ້າລະຫັດໃນ C) ແລະອີກຫລາຍໆຢ່າງ .

Linux ສະ ໜັບ ສະ ໜູນ ຫ້ອງຮຽນສອງຫ້ອງ, ຄື:

  • ຫ້ອງສະ ໝຸດ ຄົງທີ່ - ແມ່ນຜູກພັນກັບໂປແກຼມສະຖິຕິໃນເວລາທີ່ລວບລວມ.
  • ຫ້ອງສະ ໝຸດ ແບບເຄື່ອນໄຫວຫຼືແບ່ງປັນ - ມີເວລາທີ່ໂປແກຼມຖືກເປີດຕົວແລະໂຫລດເຂົ້າໃນ ໜ່ວຍ ຄວາມ ຈຳ ແລະການຜູກມັດເກີດຂື້ນໃນເວລາແລ່ນ.

ຫໍສະ ໝຸດ ທີ່ມີການເຄື່ອນໄຫວຫລືແບ່ງປັນສາມາດແບ່ງອອກເປັນ:

  • ຫໍສະ ໝຸດ ທີ່ເຊື່ອມໂຍງແບບເຄື່ອນໄຫວ - ນີ້ແມ່ນໂປແກຼມທີ່ເຊື່ອມໂຍງກັບຫໍສະມຸດທີ່ໃຊ້ຮ່ວມກັນແລະແກ່ນສາມາດໂຫລດຫ້ອງສະ ໝຸດ (ໃນກໍລະນີທີ່ມັນບໍ່ມີຄວາມຊົງ ຈຳ) ເມື່ອຖືກປະຕິບັດ.
  • ຫໍສະ ໝຸດ ທີ່ມີການໂຫຼດແບບເຄື່ອນໄຫວ - ໂຄງການຄວບຄຸມໂດຍການໂທຫາ ໜ້າ ທີ່ກັບຫ້ອງສະ ໝຸດ.

ຫ້ອງສະມຸດທີ່ໃຊ້ຮ່ວມກັນມີຊື່ເປັນສອງແບບ: ຊື່ຫ້ອງສະ ໝຸດ (a.k.a soname) ແລະຊື່“ filename” (ເສັ້ນທາງຢ່າງແທ້ຈິງໃນການຍື່ນເອກະສານທີ່ເກັບຮັກສາລະຫັດຫ້ອງສະ ໝຸດ).

ຕົວຢ່າງ: ຊື່ soname ສຳ ລັບ libc ແມ່ນ libc.so.6: ບ່ອນທີ່ lib ແມ່ນ ຄຳ ນຳ ໜ້າ, c ແມ່ນຊື່ ຄຳ ອະທິບາຍ, ດັ່ງນັ້ນ ໝາຍ ເຖິງວັດຖຸທີ່ໃຊ້ຮ່ວມກັນແລະ 6 ແມ່ນລຸ້ນ. ແລະຊື່ filename ຂອງມັນຄື: /lib64/libc.so.6. ໃຫ້ສັງເກດວ່າ soname ແມ່ນຕົວຈິງແລ້ວແມ່ນການເຊື່ອມຕໍ່ທີ່ເປັນສັນຍາລັກກັບຊື່ filename.

ຫໍສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນແມ່ນບັນຈຸໂປແກມ ld.so (ຫຼື ld.so.x) ແລະ ld-linux.so (ຫຼື ld-linux.so.x), ເຊິ່ງ x ແມ່ນລຸ້ນ. ໃນ Linux, /lib/ld-linux.so.x ຄົ້ນຫາແລະໂຫລດທຸກຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນທີ່ໃຊ້ໂດຍໂປແກຼມ.

ໂປແກຼມສາມາດໂທຫາຫ້ອງສະ ໝຸດ ໂດຍໃຊ້ຊື່ຫ້ອງສະ ໝຸດ ແລະຊື່ຂອງມັນ, ແລະເສັ້ນທາງຫ້ອງສະ ໝຸດ ເກັບມ້ຽນລາຍຊື່ບ່ອນທີ່ຫໍສະ ໝຸດ ສາມາດພົບໄດ້ໃນລະບົບແຟ້ມເອກະສານ. ໂດຍຄ່າເລີ່ມຕົ້ນ, ຫ້ອງສະ ໝຸດ ຕັ້ງຢູ່ໃນ/usr/local/lib,/usr/local/lib64,/usr/lib ແລະ/usr/lib64; ຫ້ອງສະ ໝຸດ ເລີ່ມຕົ້ນຂອງລະບົບແມ່ນຢູ່ໃນ/lib ແລະ/lib64. ນັກຂຽນໂປແກຼມສາມາດຕິດຕັ້ງຫ້ອງສະ ໝຸດ ຢູ່ໃນສະຖານທີ່ທີ່ ກຳ ຫນົດເອງ.

ເສັ້ນທາງຫໍສະ ໝຸດ ສາມາດຖືກ ກຳ ນົດໃນເອກະສານ /etc/ld.so.conf ເຊິ່ງທ່ານສາມາດແກ້ໄຂໄດ້ກັບບັນນາທິການບັນນາທິການ.

# vi /etc/ld.so.conf 

ເສັ້ນໃນເອກະສານນີ້ແນະ ນຳ ໃຫ້ແກ່ນດາວໂຫລດໄຟລ໌ໃນ /etc/ld.so.conf.d. ວິທີນີ້, ຜູ້ຮັກສາແພັກເກັດຫລືນັກຂຽນໂປແກຼມສາມາດເພີ່ມລາຍຊື່ຫ້ອງສະມຸດທີ່ ກຳ ຫນົດເອງເຂົ້າໃນລາຍການຄົ້ນຫາ.

ຖ້າທ່ານເບິ່ງເຂົ້າໃນໄດເລກະທໍລີ /etc/ld.so.conf.d, ທ່ານຈະເຫັນແຟ້ມ .conf ສຳ ລັບບາງແພັກເກດທົ່ວໄປ (ແກ່ນ, mysql ແລະ postgresql ໃນກໍລະນີນີ້):

# ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

ຖ້າທ່ານເບິ່ງທີ່ຫ້ອງ mariadb-x86_64.conf, ທ່ານຈະເຫັນເສັ້ນທາງທີ່ແນ່ນອນຕໍ່ຫໍສະ ໝຸດ ຂອງແພັກເກດ.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

ວິທີການຂ້າງເທິງນີ້ ກຳ ນົດເສັ້ນທາງຫໍສະ ໝຸດ ຖາວອນ. ເພື່ອ ກຳ ນົດມັນຊົ່ວຄາວ, ໃຫ້ໃຊ້ຕົວແປສະພາບແວດລ້ອມ LD_LIBRARY_PATH ໃສ່ເສັ້ນ ຄຳ ສັ່ງ. ຖ້າທ່ານຕ້ອງການຮັກສາການປ່ຽນແປງຢ່າງຖາວອນ, ຫຼັງຈາກນັ້ນຕື່ມແຖວນີ້ໃສ່ແຟ້ມເອກະສານເລີ່ມຕົ້ນຂອງຫອຍ/etc/profile (ທົ່ວໂລກ) ຫຼື ~ /. ປະໂຫຍດ (ສະເພາະຂອງຜູ້ໃຊ້).

# export LD_LIBRARY_PATH=/path/to/library/file

ຕອນນີ້ພວກເຮົາມາເບິ່ງວິທີການຈັດການກັບຫໍສະມຸດທີ່ໃຊ້ຮ່ວມກັນ. ເພື່ອໃຫ້ໄດ້ຮັບລາຍຊື່ຂອງຄວາມເພິ່ງພາອາໃສຫ້ອງສະ ໝຸດ ທີ່ແບ່ງປັນທັງ ໝົດ ສຳ ລັບເອກະສານໄບນາລີ, ທ່ານສາມາດໃຊ້ປະໂຫຍດ ldd. ຜົນໄດ້ຮັບຂອງ ldd ແມ່ນຢູ່ໃນຮູບແບບ:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

ຄຳ ສັ່ງນີ້ສະແດງໃຫ້ເຫັນທັງ ໝົດ ເພິ່ງພາອາໄສຫ້ອງສະ ໝຸດ ສຳ ລັບ ຄຳ ສັ່ງ ls.

# ldd /usr/bin/ls
OR
# ldd /bin/ls
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

ເນື່ອງຈາກວ່າຫໍສະມຸດທີ່ໃຊ້ຮ່ວມກັນສາມາດມີຢູ່ໃນຫລາຍລາຍຊື່ທີ່ແຕກຕ່າງກັນ, ການຄົ້ນຫາໃນບັນດາໄດເລກະທໍລີທັງ ໝົດ ນີ້ເມື່ອມີໂປແກຼມເປີດຕົວຈະບໍ່ມີປະສິດທິພາບຫລາຍ: ມັນແມ່ນ ໜຶ່ງ ໃນບັນດາຂໍ້ເສຍປຽບຂອງຫ້ອງສະ ໝຸດ ແບບເຄື່ອນໄຫວ. ເພາະສະນັ້ນກົນໄກຂອງການເກັບ ກຳ ຂໍ້ມູນທີ່ເຮັດວຽກ, ປະຕິບັດໂດຍໂປແກມ ldconfig.

ໂດຍຄ່າເລີ່ມຕົ້ນ, ldconfig ອ່ານເນື້ອໃນຂອງ /etc/ld.so.conf, ສ້າງຕົວເຊື່ອມຕໍ່ສັນຍາລັກທີ່ ເໝາະ ສົມໃນໄດເລກະທໍລີລິ້ງເຊື່ອມໂຍງແບບເຄື່ອນໄຫວ, ແລະຈາກນັ້ນຂຽນແຄດເຂົ້າ /etc/ld.so.cache ເຊິ່ງຫຼັງຈາກນັ້ນໂປແກຼມອື່ນໆໃຊ້ໄດ້ງ່າຍ .

ສິ່ງນີ້ມີຄວາມ ສຳ ຄັນຫຼາຍໂດຍສະເພາະເມື່ອທ່ານໄດ້ຕິດຕັ້ງຫໍສະມຸດທີ່ໃຊ້ຮ່ວມກັນ ໃໝ່ ຫຼືສ້າງຫ້ອງສະມຸດຂອງທ່ານເອງ, ຫຼືສ້າງປື້ມບັນດາຫ້ອງສະ ໝຸດ ໃໝ່. ທ່ານຈໍາເປັນຕ້ອງດໍາເນີນການຄໍາສັ່ງ ldconfig ເພື່ອໃຫ້ມີການປ່ຽນແປງ.

# ldconfig
OR
# ldconfig -v 	#shows files and directories it works with

ຫລັງຈາກສ້າງຫ້ອງສະມຸດທີ່ທ່ານແບ່ງປັນ, ທ່ານ ຈຳ ເປັນຕ້ອງຕິດຕັ້ງມັນ. ທ່ານສາມາດຍ້າຍມັນເຂົ້າໃນໄດເລກະທໍລີມາດຕະຖານໃດໆທີ່ໄດ້ກ່າວມາຂ້າງເທິງ, ແລະດໍາເນີນການຄໍາສັ່ງ ldconfig.

ອີກທາງເລືອກ, ດຳ ເນີນການ ຄຳ ສັ່ງຕໍ່ໄປນີ້ເພື່ອສ້າງລິ້ງສັນຍາລັກຈາກ soname ໄປຫາ filename:

# ldconfig -n /path/to/your/shared/libraries

ເພື່ອເລີ່ມຕົ້ນດ້ວຍການສ້າງຫ້ອງສະຫມຸດຂອງທ່ານເອງ, ໃຫ້ເບິ່ງຄູ່ມືນີ້ຈາກໂຄງການເອກະສານ Linux Linux (TLDP).

ສິ່ງທັງ ໝົດ ສຳ ລັບດຽວນີ້! ໃນບົດຂຽນນີ້, ພວກເຮົາໄດ້ແນະ ນຳ ທ່ານກ່ຽວກັບຫໍສະ ໝຸດ, ໄດ້ອະທິບາຍກ່ຽວກັບຫໍສະມຸດທີ່ແບ່ງປັນແລະວິທີການຈັດການມັນຢູ່ໃນ Linux. ຖ້າທ່ານມີ ຄຳ ຖາມຫຼືຄວາມຄິດເພີ່ມເຕີມທີ່ຈະແບ່ງປັນ, ໃຊ້ແບບຟອມ ຄຳ ເຫັນຂ້າງລຸ່ມນີ້.