컴파일시 ELF 파일의 심볼을 임의로 변경 할 수 있나요?

satanjr의 이미지

안녕하세요

회사에서 문제가 하나 발생했는데.. 아무리 찾아봐도 해결 방법이 없네요..

현재 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의 경우 그렇지가 못해.. 이 것도 해결책이 안되더라구요.. ㅠㅠ 제발 도와 주세요

cinsk의 이미지

현재 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/

satanjr의 이미지

저희쪽 어플은 사용하는 메모리를 내부적으로 별도로 관리 하고 있습니다.
자세히 설명을 드리긴 힘들지만 쉽게 말하면 처음 일정량을 시스템에서 할당 받고 할당 받은 영역에서 어플이 사용하는 모든 메모리를 별도 manager가 관리 하고 있는 상태입니다.

현재 호출 중 문제가 되는 부분도 저희쪽 메모리 manager가 초기화 되기전 외부 어플에 의한 new / delete 호출이라 문제가 되는거고.. 만일 초기화 되었다고 하더라도.. 메모리관리 측면에서 약간 다른 루틴이 있어 standard와 동일하게 해제 되지 않는 문제가 있습니다.

cinsk의 이미지

GCC 4.0 이상이면, visibility attribute를 참고하기 바랍니다.

void
__attribute__ ((visibility ("hidden")))
foo (void)
{
  ...
}

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

satanjr의 이미지

우선 답변 주셔서 감사합니다..
이런 옵션이 있었지는 몰랐습니다.. :)

그런데.. 아쉽게도 new / delete에는 적용이 안돼는군요..
내부적으로 생성된게 아니라 컴파일시 standard를 호출 하도록 symbol 정보가 기록되어서.. 다른곳에서
local 함수로 변경이 안돼는군요.

cinsk의 이미지

심볼을 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/

satanjr의 이미지

요즘 정신없이 일에 치여 살아서 ^^; 이제야 다시 확인 합니다.
해결은 아직 못했지만.. 참고해주신 문서로 공부가 많이 된것 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.