컴파일시 ELF 파일의 심볼을 임의로 변경 할 수 있나요?
안녕하세요
회사에서 문제가 하나 발생했는데.. 아무리 찾아봐도 해결 방법이 없네요..
현재 new /delete 를 global 영역에서 재정의 해서 사용하고 있습니다. (static 라이브러리 입니다.)
그런데 다른 라이브러리에서 자꾸 저희쪽 new delete를 호출하면서 프로그램이 죽고 있습니다.
다른 라이브러리들이 so 파일이라 링킹시 에러가 나지 않아 처음에는 왜 문제가 발생하는지 알수가 없었는데.. elf 헤더를 까보니
저희쪽에서 사용하는 다른 so 라이브러리에서 stdc++.so를 로드를 하고 new / delete 심볼이 똑같더군요.
elf 심볼을 뒤지다 보니 glib 같은 곳에선 심볼에 @@GLIB 3.4XX 이런식으로 버전 정보를 기록 하길래 저희쪽 라이브러리에도
임의로 new / delete 심볼을 위와 같이 강제로 변경을 해 버렸습니다.(static 라이브러리라 쉽게 되더군요)
이렇게 수정을 하니 당연히 외부에서 저희쪽 호출이 되지 않아 충돌 문제는 해결을 했는데 조만간 shared 로 빌드를 해야 해서.. 이 문제를 어떻게 해결을 해야 할지 참 난감하네요..
궁금한 점은 컴파일 시 우리쪽 재정의된 new /delete 혹은 특정 함수의 심볼에 위와 같은 방법으로 prefix 나 suffix를 붙이는 방법이 있거나
혹은 이런 충돌의 경우 어떻게 해결을 해야 하는지 도움을 좀 주셨으면 합니다.
namespace의 경우 일반 함수의 경우는 가능한데.. global new /delete의 경우는 지원하지 않고,
new의 경우 dummy 인자를 줘서 해결은 가능한데.. delete의 경우 그렇지가 못해.. 이 것도 해결책이 안되더라구요.. ㅠㅠ 제발 도와 주세요
현재 new /delete 를
현재 new /delete 를 global 영역에서 재정의 해서 사용하고 있습니다. 1. 재정의해서 쓰는 이유가 먼가요? 2. 재정의한 new/delete를 다른 곳에서 쓰면 안되는 이유가 있나요?
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
메모리 관리를 별도로 하고 있습니다.
저희쪽 어플은 사용하는 메모리를 내부적으로 별도로 관리 하고 있습니다.
자세히 설명을 드리긴 힘들지만 쉽게 말하면 처음 일정량을 시스템에서 할당 받고 할당 받은 영역에서 어플이 사용하는 모든 메모리를 별도 manager가 관리 하고 있는 상태입니다.
현재 호출 중 문제가 되는 부분도 저희쪽 메모리 manager가 초기화 되기전 외부 어플에 의한 new / delete 호출이라 문제가 되는거고.. 만일 초기화 되었다고 하더라도.. 메모리관리 측면에서 약간 다른 루틴이 있어 standard와 동일하게 해제 되지 않는 문제가 있습니다.
GCC 4.0 이상이면,
GCC 4.0 이상이면, visibility attribute를 참고하기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
new / delete에는 적용이 안돼는군요..
우선 답변 주셔서 감사합니다..
이런 옵션이 있었지는 몰랐습니다.. :)
그런데.. 아쉽게도 new / delete에는 적용이 안돼는군요..
내부적으로 생성된게 아니라 컴파일시 standard를 호출 하도록 symbol 정보가 기록되어서.. 다른곳에서
local 함수로 변경이 안돼는군요.
심볼을 hidden으로
심볼을 hidden으로 만드는 것에 대한 다양한 방법이 나와 있습니다.
http://people.redhat.com/drepper/dsohowto.pdf
앞에서도 말씀드렸지만, 그런 문제가 발생한 것을 ELF symbol attribute를 고쳐서 해결하는 것은 좋은 방법이 못됩니다. Design에 문제가 있는 것이 아닌지 다시 한 번 생각해보기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
감사합니다.
요즘 정신없이 일에 치여 살아서 ^^; 이제야 다시 확인 합니다.
해결은 아직 못했지만.. 참고해주신 문서로 공부가 많이 된것 같습니다.
댓글 달기