2014-01-29 11 views
8

glibc 2.14가 memcpy (bug 12518 수정)의 새 버전을 도입 한 것으로 보입니다. glibc 2.14+에 대해 컴파일 된 프로그램은 [email protected]_2.14에 대한 동적 링크를 포함하며 이전 버전의 glibc에서는 사용할 수 없습니다.이전 버전과 호환되는 동적 연결을 만드는 방법은 무엇입니까?

그러나 glibc 2.14+에는 분명히 이전 버전과의 호환성을 위해 이전 [email protected]_2.2.5 기호가 포함되어 있습니다. 나는 이전 glibc 버전과 바이너리 호환되는 방식으로 몇 가지 프로그램을 컴파일 할 수 있기를 원합니다. 어떻게 glibc 2.14+가있는 시스템에서이 오래된 심볼 버전을 사용하도록 프로그램을 컴파일합니까? 절차가 컴파일러에 따라 다르면 GCC를 사용하고 있습니다 (그러나 다른 컴파일러에서도이를 수행하는 방법을 알고있는 것이 좋습니다).

(버전 메모를 제작하는 방법 및 사용 방법, 버전이 지정된 기호가 ELF에만 해당되는지 또는 표준 부품으로 간주되어야하는지에 대해서는 잘 모름) 현대 ABI의 문서를 찾을 수 없었습니다. 주제에 대한 유용한 정보가 있습니까?

답변

3

공유 라이브러리, 기호 버전 및 관련 문제에 대한 표준 문서는 Ulrich Drepper의 http://www.akkadia.org/drepper/dsohowto.pdf입니다. . 컴파일 된 실행 파일의 "나노"가 참조하는

extern void nftw_old (int) ; 
asm (".symver nftw_old,[email protected]_2.3.3"); 
void main() 
{ 
    nftw_old(0); 
} 

참고 :

은 이전 심볼에 대한 참조를 만들려면, 당신이 그것을 선언하는 헤더를 찾을 필요가 다음 어셈블러 지시어를 사용 예상 이전 ABI [email protected]_2.3.3 구현. (이 프로그램을 실행하지 마십시오. 실제 nftw (3) 함수 서명이 다릅니다.)

+0

유일한 방법입니까? 링크를 변경하기 위해 소스 코드를 수정하지 않아도 좋을 것입니다. 최종 실행 파일을 생성 할 때 심볼 버전을 선택하도록 링커에 지시 할 방법이 없으며, 소스 코드 레벨에서 실행하는 것이 아닙니다. – Dolda2000

+0

그런데 링크를 가져 주셔서 감사합니다! – Dolda2000

+0

그 방법은 기호 버전 관리 수준에서 손으로 처리하는 것입니다. 이는 내가 생각한 것입니다. 더 간단한 방법은 기존 .a/.so/.h 파일을 사용하여 구형 소프트웨어 설치를 유지하고 컴파일/링크하는 것입니다. – fche