이전 헤더를 덮어쓰지 않고 커널 헤더 설치

이전 헤더를 덮어쓰지 않고 커널 헤더 설치

나는 잘 작동하는 최신(3.16-rc2) 커널을 구축했습니다. 내 사용자 공간 프로그램은 fcntrl.h 등에서 몇 가지 새로운 정의를 사용하기 때문에 최신 헤더에 대해 링크해야 합니다.

내 질문은 "make headers_install"을 실행할 때 이전 커널의 헤더를 어떻게 유지합니까?

실행 중인 경우

make headers_install INSTALL_HDR_PATH=/usr/src/kernels/`uname -r` 

/usr/src/include가 여전히 PATH에 있기 때문에 헤더 정의가 충돌합니다.

이 문제를 처리하는 올바른 방법은 무엇입니까?

답변1

#include동일한 경로에 두 개의 헤더를 사용할 수는 없지만 일반 경로 외부에 헤더를 설치하고 -I적절한 스위치(gcc의 경우)로 컴파일할 때 해당 헤더를 대체하도록 할 수 있습니다. 나는 당신이 이미 이것을 이해하고 있다고 생각하므로 asm/fcntl.h일반 포함 디렉토리 안에 여러 디렉토리를 넣으면 이것을 깨닫는 데 많은 생각이 필요하지 않습니다.아무튼 둘 중 하나만 적용됩니다.

그래도 너무 걱정할 필요는 없을 것 같아요. 귀하의 의견 중 일부로 시작하십시오.

최신 커널 메커니즘을 사용하는 사용자 공간 프로그램의 이러한 기능은 비활성화될 수 있습니다.

이것은 좋다. 당신이 #define NEWVALUE 666필요 하다면엮다, 여기에는 최신 커널에서만 작동하는 기능이 포함됩니다. 이러한 기능을 캡처하거나 비활성화할 수 있습니다. 그렇지 않으면 실제 애플리케이션 부분이 NEWVALUE호출되지 않습니다. 이전 커널이 실행 중일 때 사용 가능한 헤더가 정의되어 있지 않았다는 것이 아니라는 점을 명심하십시오. 설사 있었다고 해도 문제가 되지 않습니다. 왜냐하면 런타임의 실제 문제는 실제로 커널의 일부를 호출한다는 것이기 때문입니다. 존재하지 않는 커널. 핵심ABI. 헤더가 전혀 필요하지 않습니다달리기실행 파일이므로 이전 커널로 돌아가는 것은 중요하지 않습니다.

제가 약간 편집증적인 것일 수도 있지만...

예, 아니오. 이것이 남겨진 것을 컴파일하고 나중에 이전 커널로 실행할 때 새로운 기능을 활용하기 위해 여러 사람들이 임의로 서로 다른 커널 헤더를 교체하는 시스템이라면 편집증이 적절한 반응이 될 것입니다, 하하. 그러나 실제로 이 범주에 속하는 것은 많지 않을 수 있습니다.

Distros는 업그레이드할 때마다 커널 헤더를 교체하지만 동시에 교체해야 하는 사용자 공간 목록은 일반적으로 그다지 길지 않은 것 같습니다(존재하는 경우). 부분적으로는 이 경우 이전 버전과의 호환성을 유지하는 것이 너무 쉽기 때문인 것 같지만, 이 경우에는 시간이 지나도 상황이 크게 변하지 않기 때문이라고 생각합니다.

이전 타이틀을 저장하고 다시 설치할 수 있다고 생각했습니다.

이를 수행하거나 필요한 경우 적절한 소스에서 교체할 수 있습니다( make headers_install). distro 커널이고 패치가 적용될 수 있다는 우려가 있는 경우 해당 distro에 대한 소스 패키지가 있어야 합니다.

관련 정보