2011-09-15 6 views
5

프로젝트의 .so 라이브러리 중 하나에 대한 빠른 수정을 원합니다. .so 파일을 다시 컴파일하고 원본 파일을 바꾸는 것이 안전합니까? 아니면 전체 프로젝트를 다시 빌드하고 다시 설치해야합니까? 또는 그것은 달려 있습니까?리눅스에서 프로젝트의 공유 라이브러리 (.so) 중 하나에서 수정하는 방법은 무엇입니까?

+0

메이크 파일을 결정하는 것이 아니라, 어떤 구성 요소를 재구성해야합니까? 따라서 어떤 파일을 교체해야하는지 확인해야합니다. –

+0

@ott : make는 당신이 말하지 않으면 런타임 .so deps에 대해 알거나 신경 쓰지 않을 것입니다. 확실히 ABI에 대한 결정을 내리는 데 필요한 것을 제공하는 것은 실용적이지 않습니다. –

답변

4

다릅니다. 공유 라이브러리는 실행 파일과 함께 binary-compatible이어야합니다. 예를 들어

,

  1. 당신이 라이브러리의 내부 기능 중 하나의 동작을 변경 한 경우, 당신은 아마 다시 컴파일 할 필요가 없습니다.
  2. 응용 프로그램에서 알고있는 구조체의 크기를 변경 한 경우 (예 : 멤버 추가) 재 컴파일해야합니다. 그렇지 않으면 라이브러리와 응용 프로그램에서 구조체가 그보다 작다고 생각할 수 있습니다. 라이브러리는 응용 프로그램이 기록하지 않은 여분의 초기화되지 않은 멤버를 읽으려고 시도합니다.
  3. 응용 프로그램에서 볼 수있는 인수의 형식이나 위치를 응용 프로그램에서 볼 수있는 것처럼 변경하면 라이브러리가 응용 프로그램에 스택보다 더 많은 인수를 스택에서 읽으려고하기 때문에 다시 컴파일해야합니다 C와의 대/소문자 C++의 인수 유형은 함수 서명의 일부이므로 응용 프로그램이 충돌하는 대신 실행을 거부합니다.

엄지 손가락 (생산 릴리스)의 규칙은, 당신이 다시 컴파일해야 당신이 바이너리 호환성을 유지, 또는없는 바이너리 무엇 호환성을 확인하는 것을 의식적으로 인식하지 경우이다.

+0

3 : 기본 매개 변수의 변경 사항은 ABI에 영향을주지 않습니다. cdecl 호출 (C의 기본값과 GCC의 thiscall)의 경우 호출자는 실제로 스택을 정리합니다. 오른쪽에서 왼쪽으로 호출하는 규칙에 대해 예상보다 많은 매개 변수를 전달할 수도 있지만 그 이상은 아닙니다. –

+0

@Matt, 나는 * 기본 * 인수, 그냥 인수 언급하지 않았다. :) 또한, 도서관 측에서 더 많은 인수로 끝나는 것이 더 일반적이기 때문에 라이브러리는 가비지 값에 액세스하려고 시도합니다. –

1

확실히 동적 라이브러리를 사용하려는 의도입니다. 라이브러리의 내용을 업데이트해야하는 경우 라이브러리를 업데이트하면 사용하는 프로그램을 변경할 필요가 없습니다. 변경중인 함수의 시그니처가 변경되지 않고 동일한 작업을 수행하면 일반적으로 문제가되지 않습니다.

물론 프로그램이 문서화되지 않은 함수의 부작용에 의존하는 경우가 있으며 그 함수의 구현을 변경하면 부작용이 바뀌고 프로그램이 중단 될 수 있습니다. 하지만 은 (가)입니다.

1

공유 라이브러리의 ABI을 변경하지 않았다면 라이브러리를 다시 빌드하고 바꿀 수 있습니다.

1

.

그러나 나는 다른 물건을 만든 정확한 소스와 컴파일러가 있다고 가정하고 이제 .cpp 파일 만 변경하면 괜찮습니다.

기타. 헤더 파일에서 인터페이스 (공유 라이브러리와 나머지 시스템 사이)를 변경하는 것은 좋지 않습니다.

관련 문제