공유 라이브러리와 실행 파일안의 심볼이 겹칠 때 문제
글쓴이: ddoman / 작성시간: 목, 2005/10/20 - 9:14오전
/* a.cpp */ #include <stdio.h> void b(); void a() { printf("a\n"); b(); } void b() { printf("b\n"); }
/* b.cpp */ #include <stdio.h> void a(); void b() { printf("b of main\n"); } int main() { a(); }
위의 코드를 아래와 같이 빌드하였습니다.
g++ -c a.cpp b.cpp
g++ -o a.so -shared a.o
g++ -o main b.o ./a.so
출력 결과는
Quote:
a
b of main
a.cpp 코드만 보면 a()는 a.cpp의 b()를 호출한다고 생각을 했는데
b.cpp랑 링크되면서 b.cpp의 b()를 호출해버리는 결과가 나오더군요
so와 실행파일의 심볼이 겹칠 경우 실행파일안에 있는 심볼에 우선순위가 주어지는거 같은데 이것을 회피하는 방법을 알고 싶습니다.
일단 namespace를 사용해 mangling 되는 심볼 이름을 다르게 해서 해결은 했습니다만 다른 방법은 없을지 궁금합니다.
Forums:
Re: 공유 라이브러리와 실행 파일안의 심볼이 겹칠 때 문제
이런 상황에선 링크 에러가 나는게 맞는거 같은데 링크에러 안 나나요? ㅡ.ㅡ
네임스페이스를 쓰시던지, b함수를 static void b() 와 같이 선언해서 써보세요..
Re: 공유 라이브러리와 실행 파일안의 심볼이 겹칠 때 문제
정적 링크에선 나겠지만 동적 링크에서는 나지 않는군요.
댓글 달기