인라인 어셈을 공유 라이브러리로 만들었을때 발생하는 문제
글쓴이: cho's / 작성시간: 목, 2003/10/09 - 8:06오후
안녕하세요. 일을 하다가 풀리지 않는 문제로 고민하다 글을 올립니다.
인라인 어셈을 공유 라이브러리로 만들었을때 문제가 발생하고 있습니다.
스태틱하게 할때와 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이렇게 사용하는 경우는 어떤 의미인가요?
Forums:
자답]elf포맷관 관련된 문제
position independent code를 생성하기 위해서는 위의 코드와 같이
_GLOBAL_OFFSET_TABLE 를 생성하게 되는데 이때 elf포맷에서는 이 영역을 ebx레지스터에 할당하게 됩니다.
저의 경우 그것도 모르고 데이터를 ebx레지스터에 mov해서 사용했는데 이 때문에 에러가 발생했더군요. 이 레지스터대신 esi를 사용하니 아무 문제가 없군요.
덕분에 많은거 배운거 같네요.
댓글 달기