본문 바로가기
카테고리 없음

error: address of bit-field requested

by 큰공 2024. 1. 29.
728x90
반응형

error: address of bit-field requested

Android 13 AOSP 빌드 시에 상기 에러가 발생하면서 빌드가 안될 경우가 발생해서, 해당 에러에 대해서 원인 분석을 해보고 해결하는 방법에 대해서 설명하도록 하겠습니다.

에러 전문

vendor/qcom/proprietary/camx-common/settings/sa8650/g_camxsettings.cpp:3507:9: error: address of bit-field requested
        &m_pStaticSettings->raiserecoverysigabrt);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vendor/qcom/proprietary/camx-common/settings/sa8650/g_camxsettings.cpp:8091:9: error: address of bit-field requested
        &m_pStaticSettings->raiserecoverysigabrt);

 

원인

error: address of bit-field requested 우선 해당 에러가 왜 발생하는지 살펴보도록 하겠습니다. 

"address of bit-field requested" 에러는 C++에서 발생하는 비트 필드에 대한 주소를 요청하려고 할 때 컴파일러가 발생시키는 에러 메시지입니다. 이러한 에러는 비트 필드에 대한 주소를 직접적으로 얻는 것이 허용되지 않는다는 것을 나타냅니다.

 

C++에서 비트 필드는 구조체 또는 클래스 내에서 비트 단위로 필드를 정의하는 것을 말합니다. 예를 들어, 다음과 같이 비트 필드를 사용하는 구조체를 생각해보겠습니다:

struct Example {
    int flag : 1;
    int value : 7;
};


이 구조체는 flag라는 1비트 크기의 필드와 value라는 7비트 크기의 필드를 가지고 있습니다. 이런 비트 필드에 대한 주소를 직접적으로 얻는 것은 허용되지 않습니다. 따라서 다음과 같은 코드는 에러를 발생시킬 수 있습니다:

Example example;
int* ptr = &example.flag;  // 에러: address of bit-field requested


위의 코드에서 &example.flag는 flag 비트 필드의 주소를 얻으려고 시도하는 부분이며, 이는 C++에서 허용되지 않습니다.

 

해결책1

 위의 원인 분석에 따라 m_pStaticSettings->raiserecoverysigabrt 의 주소값을 직접적으로 사용하지 않고, 해당 값을 사용하도록 수정하면 됩니다.

 비트 필드의 주소를 가져오려고 하는 대신 비트 필드의 값을 직접 사용하거나 필요하다면 복사본을 만들어야 합니다.  다음은 코드를 어떻게 수정할 수 있는지에 대한 예입니다:

//이렇게하지마세요:
//&m_pStaticSettings->raiserecoverysigabrt

//이렇게사용하세요:
m_pStaticSettings->raiserecoverysigabrt

 

포인터를 기대하는 함수에 값을 전달해야 하는 경우, 비트 필드 값의 복사본을 만들고 복사본의 주소를 전달할 수 있습니다:

//비트필드값의복사본을만듭니다
autobitfield_copy=m_pStaticSettings->raiserecoverysigabrt;

//이제복사본의주소를가져올수있습니다
&bitfield_copy

 

 이런 식으로 수정하는게 보편적인 수정 방법입니다.

 

해결책2

 하지만, 해당 코드는 필자가 작성한 코드에서 발생하는 에러가 아니라, Android AOSP Full 빌드 시에 발생하는 현상으로 다른 환경에서는 정상빌드가 되는것을 확인 한 코드입니다. 

vendor/qcom/proprietary/camx-common/ 하위에 대한 내용은 Android AOSP Full 빌드 시에 파일이 Perl Script 에 의해서 서버 환경에 따라 코드가 변경되는 것이 확인 되었습니다.

 

 해당 문제는 Perl 버젼이 낮을 경우, vendor/qcom/proprietary/camx-common/settings/sa8650/g_camxsettings.h 파일의

m_pStaticSettings->raiserecoverysigabr 변수가 비트 단위의 필드로 구성되도록 수정이 됩니다.

 

 근본적인 해결 방법은 Perl 버젼의 업데이트를 통해서 해결했습니다.

 

Perl Version Update

2024.01.29 - [IT/IT 잡지식] - Perl install in Ubuntu

 

Perl install in Ubuntu

Perl install in Ubuntu 분투 환경에서 Perl 을 설치하는 방법에 대해서 알아보겠습니다. 환경 ubuntu 18.04.3 LTS perl 5.26 버전이 설치된 상태에서 perl 5.36 버전으로 업그레이드 설치된 Perl 버전 확인 $ perl -v

coinpipe.tistory.com

 

요약

vendor/qcom/proprietary/camx-common/settings/sa8650/g_camxsettings.cpp:3507:9: error: address of bit-field requested

        &m_pStaticSettings->raiserecoverysigabrt); 에러 발생시 Perl 버젼을 최신버젼으로 업데이트 하자.

728x90
반응형

댓글