인라인 어셈을 공유 라이브러리로 만들었을때 발생하는 문제

cho's의 이미지

안녕하세요. 일을 하다가 풀리지 않는 문제로 고민하다 글을 올립니다.
인라인 어셈을 공유 라이브러리로 만들었을때 문제가 발생하고 있습니다.
스태틱하게 할때와 shared형태로 할때가 결과값이 전혀 다르게 나타나고 있거든요요.
처음에는 static하게 빌딩해서 아무 이상이 없었는데
공유 라이브러리로 만들기 위해서 -fPIC옵션을 주면 전혀 다른 값을 내보냅니다.
이미지 관련 루틴인데 mmx 인라인 어셈으로 처리했구요. 간단하게 보자면 다음과 같습니다.

extern const short tab_row[];
extern const short tab_col[];
img_mmx(short* blk)
{
asm volatile(
...
 :
 :"m"(blk), "m"(*tab_row), "m"(*tab_col)
 :"memory"
);
);

}


position independent code를 생성하는건 알겠는데 그런다고 전혀 다른 결과가 나오는 것은 이해할 수가 없네요. 현재 상황에서는 ...
그래서 오브젝트 파일을 nm으로 조사 해봤습니다.
-fPIC옵션을 준것
           U _GLOBAL_OFFSET_TABLE
...000  T __i686.get_pc_thunk.bx
...000  T __i686.get_pc_thunk.cx
...324  T img_mmx
           U tab_row
           U tab_col


-fPIC옵션을 안 준것
...324  T img_mmx
           U tab_row
           U tab_col

제가 발생할수 있는 코드 변형이라던가 그런걸 막을수 있는 옵션이 있나요? 아니면 gcc의 버그인가요?현재 최신버젼인 3.3.1을 쓰고 있는데 버그 리포트에 이문제와 비슷한 문제가 해결되 있는걸로 나오거든요. 최신 버젼에서는...

ELF파일 생성에서 위치 비의존 코드 생성시 메모리가 재배치되면서 발생하는 문제 같은데 이 문제를 어떤 방향으로 접근해서 해결해야 할까요?
어떠한 조언이라도 감사히 받겠습니다.
좋은 하루 되십시오.

ps.
그리고 -fPIC -DPIC이렇게 사용하는 경우는 어떤 의미인가요?

cho's의 이미지

position independent code를 생성하기 위해서는 위의 코드와 같이
_GLOBAL_OFFSET_TABLE 를 생성하게 되는데 이때 elf포맷에서는 이 영역을 ebx레지스터에 할당하게 됩니다.
저의 경우 그것도 모르고 데이터를 ebx레지스터에 mov해서 사용했는데 이 때문에 에러가 발생했더군요. 이 레지스터대신 esi를 사용하니 아무 문제가 없군요.

덕분에 많은거 배운거 같네요.

댓글 달기

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