Как решить «ld: ошибка: .* :перемещение R_ARCH64_ADR_PREL_PG_HI21 вне диапазона: 20145225728 отсутствует в [-4294967296, 4294967295]»

#android #c #c #android-ndk #clang

Вопрос:

Я создаю исполняемый файл для Android, используя cmake и ninja:

 cmake -H../ -DCMAKE_CXX_FLAGS=-std=c  11 -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=$ABI -DANDROID_NDK=$NDK -DANDROID_PLATFORM=android-$MIN_SDK_VERSION -DCMAKE_ANDROID_ARCH_ABI=$ABI -DCMAKE_ANDROID_NDK=$NDK -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=$ABI -DCMAKE_MAKE_PROGRAM=$SDK_PATH/cmake/$CMAKE_VERSION/bin/ninja.exe -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=$MIN_SDK_VERSION -DANDROID_STL=c  _static -B$BUILD_DIR -GNinja

ninja
 

В проекте есть несколько очень больших переменных, объявленных в глобальном пространстве файла:

 BCCH_BCH_Message bcch_bch_Message;
BCCH_DL_SCH_Message bcch_dl_sch_Message;
DL_CCCH_Message dl_ccch_Message;
DL_DCCH_Message dl_dcch_Message;
PCCH_Message pcch_Message;
...
 

Когда я запущу проект, я начну получать ошибки сборки, такие как следующие:

 -- The C compiler identification is Clang 11.0.5
-- The CXX compiler identification is Clang 11.0.5
-- Check for working C compiler: D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe
-- Check for working C compiler: D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe -- works      
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64/bin/clang  .exe
-- Check for working CXX compiler: D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64/bin/clang  .exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Development/CPP/ASNWrapper/build
[4/4] Linking CXX executable asn_wrap
FAILED: asn_wrap
cmd.exe /C "cd . amp;amp; D:Sdkndk22.0.7026061toolchainsllvmprebuiltwindows-x86_64binclang  .exe --target=aarch64-none-linux-android29 --gcc-toolchain=D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/windows-x86_64/sysroot  -fPIC -O2 -DNDEBUG  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc   -Wl,--build-id=sha1 -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections CMakeFiles/asn_wrap.dir/src/test_dl_dcch.cpp.o CMakeFiles/asn_wrap.dir/src/nas_asn_wrap.cpp.o CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o  -o asn_wrap -LD:/Development/CPP/ASNWrapper/lib/arm64-v8a -lasn1per -lasn1rt -lasn1rt3gpp -losys3gpp ../lib/arm64-v8a/libasn_rrc.a -llog -latomic -lm amp;amp; cd ."
ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0xDF0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 10986287104 is not in [-4294967296, 4294967295]; references pcch_Message
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0xE90): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 10986291200 is not in [-4294967296, 4294967295]; references ul_ccch_Message
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0xF30): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 10986291200 is not in [-4294967296, 4294967295]; references ul_ccch1_Message
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0xFD0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 10986287104 is not in [-4294967296, 4294967295]; references ul_dcch_Message
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1070): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 14935199744 is not in [-4294967296, 4294967295]; references 
rrcReconfig
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1110): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145197056 is not in [-4294967296, 4294967295]; references 
rrcReconfigComp
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x11B0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145225728 is not in [-4294967296, 4294967295]; references 
sib1
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1250): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145434624 is not in [-4294967296, 4294967295]; references 
sysInfo
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x12F0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145381376 is not in [-4294967296, 4294967295]; references 
sib2
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1390): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145381376 is not in [-4294967296, 4294967295]; references 
sib3
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1430): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145385472 is not in [-4294967296, 4294967295]; references 
sib4
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x14D0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145426432 is not in [-4294967296, 4294967295]; references 
sib5
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1570): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145434624 is not in [-4294967296, 4294967295]; references 
sib6
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1610): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145434624 is not in [-4294967296, 4294967295]; references 
sib7
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x16B0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145434624 is not in [-4294967296, 4294967295]; references 
sib8
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x1750): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20145434624 is not in [-4294967296, 4294967295]; references 
sib9
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: /buildbot/src/android/ndk-release-r22toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/../libcxx/include/__threading_support:367:(.text.__cxa_guard_abort 0x10): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20144017408 is not in [-4294967296, 4294967295]
ld: error: /buildbot/src/android/ndk-release-r22toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/../libcxx/include/__threading_support:367:(.text._ZN12_GLOBAL__N_115fallback_mallocEm 0x10): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20143935488 is not in [-4294967296, 4294967295]
ld: error: /buildbot/src/android/ndk-release-r22toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/../libcxx/include/__threading_support:367:(.text.__cxa_guard_acquire 0x2C): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 20144021504 is not in [-4294967296, 4294967295]
ld: error: rrc_asn_wrap.cpp:(function rrc_asn_wrap::decode_nr(rrc_asn_wrap::l3_type, unsigned char const*, unsigned long): .text 0x17F0): relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 11474681856 is not in [-4294967296, 4294967295]; references 
cellGroupConfig
>>> defined in CMakeFiles/asn_wrap.dir/src/rrc_asn_wrap.cpp.o

ld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)
clang  : error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
 

Я не получаю ошибок, если комментирую глобальную переменную, которая кажется очень большой, например:

 // DL_CCCH_Message dl_ccch_Message;
// DL_DCCH_Message dl_dcch_Message;
 

Но мне действительно нужны эти переменные.
За последние три дня я много искал в Интернете. Некоторые говорят, что нужно добавить «-fPIC», и я это сделал, но все равно эти ошибки не устранены.

Вот объявление одной такой переменной в заголовочном файле:

 /**************************************************************/
/*                                                            */
/*  DL_CCCH_Message                                           */
/*                                                            */
/**************************************************************/
/*
DL-CCCH-Message ::= SEQUENCE {
   message [0] EXPLICIT DL-CCCH-MessageType
}
*/
typedef struct EXTERN DL_CCCH_Message {
   DL_CCCH_MessageType message;
} DL_CCCH_Message;
 

The definition of this is in .so file and the code is not given to me. So, I can just use it as it is.

Please suggest something to resolve these errors.