[완료] Linux library 등록 / 편집 관련

qldpfh의 이미지

한참 찾아다니다 도저히 못찾아서 이렇게 글을 적어봅니다.

참고로 전 Linux와 Programing 모두 초보입니다.. 이상하게 질문드리더라도 양해 및 테클 바랍니다.^^
일단 전 Redhat 9.0 을 사용하고.. 있습니다.

상황을 설명드리자면 기존 /usr/lib/libgdk.so libgdk-1.2.so.0 .... 이 있습니다..
본래 이파일은 별 문제가 없었습니다.
하지만 문제가 생기는건.. libgdk 및 링크된 파일들이.. 다른곳에서 제공해준 파일이 있다는 것이죠.
원래 있는걸 사용하면 좋겠지만.. 제공 받은 파일을 이용해서 해야한다는 것이 문제입니다.

우선 기존 파일로 사용을 하면
/root/.../lib/libmsbgtk.so: undefined reference to `gdk_event_set_appid`
collect2: ld returned 1 exit status
라는 에러메세지가 뜹니다. 이 메세지의 뜻은 저두 압니다.. gdk_event_set_appid 란 함수가 정의된곳을
못찾겠다는 거겠죠..(맞나요?^^;)
위 library파일도 제공받은겁니다..

그래서 이번엔 제공받은 gdk library파일을 /usr/lib에 복사를 했습니다. (본래 파일은 백업 시켜 두고요)
그렇게 다시 빌드를 하니 위 에러는 안뜹니다. 하지만
/usr/lib/libgdk.so: undefined refernece to `XtwsSetPixmapTransparent`
/usr/lib/libgdk.so: undefined refernece to `XtwsCreatePixmapRom`
/usr/lib/libgdk.so: undefined refernece to `XtwsDrawStringExtra`
....몇개 더있습니다만..너무 길어서..
이런 오류가 뜹니다. 제공 받은 library파일에 저 함수들이 제대로 참조가 안됬거나 구현이 안됬단 얘기겠죠..

그래서 ldd를 이용하여 링크된 library를 조회를 해보았습니다.
먼저 기존 libgdk.so 파일입니다.
(뒤쪽 경로는 뻇습니다. 너무 길어서..)
libgmodule-1.2.so.0
libglib-1.2.so.0
libdl.so.2
libXi.so.6
libXext.so.6
libX11.so.6
libm.so.6
libc.so.6
/lib/ld-linux.so.2

그리고 제공받은 libgdk.so 입니다.
libgmodule-1.2.so.0
libglib-1.2.so.0
libgl.so.2
libX11.so.6
libXext.so.6
libres.so
libres_dspimg.so
libm.so.6
libc.so.6
/lib/ld-linux.so.2

비교를 해보면 몇개가 틀립니다.
더 많으면 상관없겠지만.. 제공받은것에는 libXi.so.6가 없더군요
더있는것도 있지만. 그래서 생각끝에 library에 걸린 링크를 수정하면 어떨까.
하는 생각에 열심히 찾아봤습니다.. 하지만 없습니다..ㅠㅠ(못찾은거겠지..ㄷㄷ)

상황을 설명드리느라 길어졌는데...
제가 정확히 알고싶은건 3가지입니다.
1. library 파일에 걸려있는 참조들.. ldd로 나오는 값들..을 수정할수 있나요?
제가 하고싶은건 위에 빠진 참조를 추가 하고싶습니다.
2. 수정이 안된다면 새로 library를 만들어야 할것같은데 object 파일이 없는 경우에..
so 파일로만 저런 참조를 가진 library를 만들수 있을까요
3. library 수정 및 신규 생성 외에 제가 생각지 못한 방법으로 위 문제를 해결할수 있을까요?
좀더 쉽거나 아니면 해결 가능한 방안이 있으시면 답변 부탁드립니다..^^

끝까지 읽어주셔서 감사하구요.. 좋은 답변 기다리겠습니다.
오늘도 좋은 하루되시길...

IsExist의 이미지

일단 리눅스에서 so(shared object) 파일들은 LD_LIBRARY_PATH 환경변수에 나열된 경로를 찾아
로드 됩니다. ldd 로 링크를 조사하는 것도 역시 저 환경변수에 나열되 경로를 우선으로 해서
찾습니다.

대게 시스템 글로벌한 app 또는 library 가 아니라면 /usr/lib, /usr/local/lib 에 두는건
좋은 방법이 아닙니다. 따로 경로를 만들고 그 곳에 so 랑 실행파일을 두는게 좋습니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

qldpfh의 이미지

답변 감사합니다.

Quote:

대게 시스템 글로벌한 app 또는 library 가 아니라면 /usr/lib, /usr/local/lib 에 두는건
좋은 방법이 아닙니다.

이 부분은 저도 실감했습니다. /usr/lib 에 있는 gdk library를 손댔다가..
부팅시 /lib/libcom_err.so.2 가 에러가 발생하더군요...

Quote:

따로 경로를 만들고 그 곳에 so 랑 실행파일을 두는게 좋습니다.

이 부분말인데요. 기존에 있는 GTK+ Library를 사용하지 않고 제공받은 Library를 경로로 잡아서
컴파일 하고 싶은데요. 위에 제가 질문 드렸던것에 보면

Quote:

/root/.../lib/libmsbgtk.so: undefined reference to `gdk_event_set_appid`
collect2: ld returned 1 exit status

libmsbgtk.so 라는 파일이 있는데요 이 파일이 참조한는 gdk library의 경로가
/usr/lib/libgdk.so 입니다.

여기서 질문을 드리고 싶은데요. /usr/lib/libgdk.so 를 수정하지 않고 제공받은
/root/.../usr/lib/libgdk.so 를 참조시키게 하고싶은데... 어떻게 해야 할까요.
libmsbgdk.so 의 object파일은 없구요 so파일만 있습니다.

읽어주셔서 감사합니다~
좋은 하루 되시길 바랍니다~

bushi의 이미지

LD_LIBRARY_PATH 를 사용하면 run-time 에 로더가 뒤지는 라이브러리 경로를 조정할 수 있습니다.
(LD_LIBRARY_PATH=/opt/some/where/lib:/opt/some/where/usr/lib /some/where/anything)

compile-time 때 링커가 뒤지는 라이브러리 경로는 -L 옵션으로 조정할 수 있습니다.(GCC)
(gcc -o something something.c -L /opt/some/where/lib -L /opt/some/where/usr/lib -l somelib)

OTL

qldpfh의 이미지

몰랐던 사실입니다.

좋은 정보 감사합니다.^^

qldpfh의 이미지

먼저 답변을 주신분들께 감사의 말씀을 올립니다.
많은 도움이 되었거든요.^^ 결정적인 힌트는 LD_LIBRARY_PATH < 요놈이었습니다.ㅎ

우선 위에 제가 올린 질문중 저런 상황이 일어난 이유부터 적어보겠습니다.
기본적으로 Redhat9.0에 깔려있는 gtk와 gdk가 있다고 말씀드렸던거 같은데요
위에 저런 오류가 났던건 의외로 간단했습니다.

제공받은 library들이 참조하는 곳은 LD_LIBRARY_PATH와 다른장소
/root/..../root/usr/lib << 이런 각각의 다른장소에 library가 있습니다.
그리고 제공받은 library들이 참조하는 library는 시스템에 기본적으로 설치된
library들이 아닌 제공받은 library를 참조 해야하는데 여기서 문제가 발생합니다.
위 질문에 보면 함수가 undefine되어있는데요. 그이유가.. 바로 참조해야할 경로를
잘못 알기 때문입니다. 무슨 말이냐 하면.

Quote:
우선 기존 파일로 사용을 하면
/root/.../lib/libmsbgtk.so: undefined reference to `gdk_event_set_appid`
collect2: ld returned 1 exit status
라는 에러메세지가 뜹니다. 이 메세지의 뜻은 저두 압니다.. gdk_event_set_appid 란 함수가 정의된곳을
못찾겠다는 거겠죠..(맞나요?^^;)
위 library파일도 제공받은겁니다..

이부분에서 libmsbgtk.so 의 참조중 libgdk.so가 있습니다.
근데 이 libgdk.so는 시스템에 기본적으로 있는 '아마/usr/lib 일겁니다' library가 아닌 제공받은
libgdk.so를 써야 한다는 것이죠. gdk_event_appid << 이거 기존 파일엔 없습니다.
제공받은 파일에만 있지요. 이문제를 해결해 주는 부분이 바로 LD_LIBRARY_PATH입니다.
왜 이게 문제가 되느냐..

Quote:
일단 리눅스에서 so(shared object) 파일들은 LD_LIBRARY_PATH 환경변수에 나열된 경로를 찾아
로드 됩니다. ldd 로 링크를 조사하는 것도 역시 저 환경변수에 나열되 경로를 우선으로 해서
찾습니다.

이말이 바로 정답입니다.
libmsbgtk.so를 ldd로 조사해본결과
libgtk.so
libgdk.so
더있지만 일단 이두개를 참조 하고있었습니다.
본래 만든사람의 의도는 만들어진 library를 참조하기 위해 넣은것이지요.
하지만 LD_LIBRARY_PATH에 의해 기존의 경로를 검색해서 거기있는 library를 사용한것이지요. (자기멋대로..ㄷㄷ)
그래서 결국 다른 library를 참조하게 되니 저런 오류가 발생했던 겁니다.
그래서 터미널 창에서 LD_LIBRARY_PATH를 싹 바꿨습니다. 필요한 library만 사용하게요. 그러니 되더군요

요약해보면 ldd의 결과로 나오는 참조 목록은 어떠한 경로를 포함하는게 아니라 단지 '난 이런 library를 쓰고있다' 라고
이름만 보여주는겁니다. 그럼 컴파일 과정중 링크시에 library는 참조된 library를 LD_LIBRARY_PATH에서 있나 없나를
찾아보고 거기 있는것을 사용한다는 것이죠. 컴파일 완료 후 파일 실행시도 마찬가지입니다. 공유 라이브러리는 실행시에
해당 라이브러리를 찾아서 사용한다. 라고 알고있습니다. 정적 라이브러리는 실행파일에 라이브러리를 포함하구요.
그래서 마찬가지로 실행하면서 LD_LIBRARY_PATH에 있는 경로로 검색을 해서 library를 사용하게 되는것이지요.

그리고 다른 so파일 을 참조하여 so파일을 만드는 것은 의외로 간단했습니다.
먼저 해야할일은 LD_LIBRARY_PATH를 수정해주는것 위에 설명한것처럼 참조해야할 경로들을 넣어주면 됩니다.
그리고

 
gcc -fPIC -c file1.c file2.c 
gcc -shared -Wl,-soname,libmy.so.0 -o libmy.so.0.0.0 file1.o file2.o -L/root/..../root/usr/lib -lgtk -lgdk

이런식으로 하면됩니다. 중요한것은 LD_LIBRARY_PATH죠..

여기서 주의할점이 있습니다. 제가 ~/.bash_profile 파일에
LD_LIBRARY_PATH=/root/.../root/usr/lib
를 추가해서 시도를 해보았습니다.
이렇게 되면 LD_LIBRARY_PATH가 전부 바뀌는게 아니라 기존 경로 + 새로 지정한 경로가 됩니다.
여기서 중복되는 파일이 없다면 문제될것이 없겠지만. 저같은 경우는
libgtk.so libgdk.so ...등등 많은 파일이 중복 되었습니다.
결국 로그인시 파일 충돌로 인해 로그인이 안되더군요...ㅠㅠ

이렇게 해서 해결이 되었습니다.
혹시나 저와 비슷한 상황을 겪고 계신분들을 위해서 그리고 나중에 제가 다시 보기위해서
이렇게 댓글을 올려둡니다.

글을 보시고 이상한점이나 제가 잘못알고 있는점이 있으면 댓글 남겨주시기 바랍니다.

끝까지 읽어주셔서 감사합니다.^^
그럼 좋은하루 되시길...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.