Как исправить ошибку «ld: 32-битная относительная ссылка RIP вне диапазона» при связывании объекта, созданного из исходн ⇐ C++
Как исправить ошибку «ld: 32-битная относительная ссылка RIP вне диапазона» при связывании объекта, созданного из исходн
Я создаю приложение на C++ для нескольких платформ, и у меня есть большой массив байтов, который я хотел бы встроить в приложение (его размер составляет около 40 МБ).
Раньше я создавал заголовочный файл C++, содержащий данные, представленные в виде массива C++, но его компиляция занимает очень много времени. Сейчас я пытаюсь сгенерировать исходный файл ассемблера, использовать директиву "incbin" для включения данных, а затем связать полученный объектный файл с моим приложением, тем самым устраняя необходимость использования компилятора C++.
У меня возникли проблемы с платформой Mac. Я компилирую, используя XCode 13.4.1, для целей Arm64 и x64_64. Решение отлично работает для Arm64, но не работает для x86_64.
В частности, я получаю следующую ошибку ссылки:
окончательный макет раздела: __TEXT/__text адрес=0x100003F70, размер=0x0000001D, fileOffset=0x00003F70, тип=1 __TEXT/__stubs адрес=0x100003F8E, размер=0x00000006, fileOffset=0x00003F8E, тип=29 __TEXT/__stub_helper адрес=0x100003F94, размер=0x0000001A, fileOffset=0x00003F94, тип=33 __TEXT/__cstring адрес=0x100003FAE, размер=0x00000004, fileOffset=0x00003FAE, тип=13 __TEXT/__unwind_info адрес=0x100003FB4, размер=0x00000048, fileOffset=0x00003FB4, тип=22 __DATA_CONST/__got addr=0x100004000, размер=0x00000008, fileOffset=0x00004000, тип=30 __DATA/__la_symbol_ptr адрес=0x100008000, размер=0x00000008, fileOffset=0x00008000, тип=28 __DATA/__data адрес=0x100008040, размер=0x025047A0, fileOffset=0x00008040, тип=0 ld: относительная ссылка 32-битного RIP выходит за пределы диапазона (-4256167970 максимум +/-2 ГБ): от _main (0x100003F70) до _kEmbeddedDataPack_sz (0x02504760) в '_main' из /Users/nickko/Library/Developer/Xcode/DerivedData/ TestApp-fmueotrdocmveqccnonnadmvuhpd/Build/Intermediates.noindex/TestApp.build/Debug/TestApp.build/Objects-normal/x86_64/main.o Для справки, это ассемблерный файл, который я генерирую:
.data .balign 64 .global _kEmbeddedDataPack _kEmbeddedDataPack: .incbin "mydata.bin" .global _kEmbeddedDataPack_end _kEmbeddedDataPack_end: .global _kEmbeddedDataPack_sz .set _kEmbeddedDataPack_sz, . - _kEmbeddedDataPack Я пробовал собрать с помощью -fno-pic -fno-pie -no-pie, но это не решило проблему. Я также пытался выполнить сборку с параметром -mcmodel=large, но это вызывает другую ошибку компоновщика.
Можно ли как-нибудь успешно связать это решение? Я бы хотел придерживаться подхода создания ассемблерного файла, если это возможно, потому что я также нацелен на другие платформы с помощью clang (не только XCode/Mac).
Спасибо за помощь.
Я создаю приложение на C++ для нескольких платформ, и у меня есть большой массив байтов, который я хотел бы встроить в приложение (его размер составляет около 40 МБ).
Раньше я создавал заголовочный файл C++, содержащий данные, представленные в виде массива C++, но его компиляция занимает очень много времени. Сейчас я пытаюсь сгенерировать исходный файл ассемблера, использовать директиву "incbin" для включения данных, а затем связать полученный объектный файл с моим приложением, тем самым устраняя необходимость использования компилятора C++.
У меня возникли проблемы с платформой Mac. Я компилирую, используя XCode 13.4.1, для целей Arm64 и x64_64. Решение отлично работает для Arm64, но не работает для x86_64.
В частности, я получаю следующую ошибку ссылки:
окончательный макет раздела: __TEXT/__text адрес=0x100003F70, размер=0x0000001D, fileOffset=0x00003F70, тип=1 __TEXT/__stubs адрес=0x100003F8E, размер=0x00000006, fileOffset=0x00003F8E, тип=29 __TEXT/__stub_helper адрес=0x100003F94, размер=0x0000001A, fileOffset=0x00003F94, тип=33 __TEXT/__cstring адрес=0x100003FAE, размер=0x00000004, fileOffset=0x00003FAE, тип=13 __TEXT/__unwind_info адрес=0x100003FB4, размер=0x00000048, fileOffset=0x00003FB4, тип=22 __DATA_CONST/__got addr=0x100004000, размер=0x00000008, fileOffset=0x00004000, тип=30 __DATA/__la_symbol_ptr адрес=0x100008000, размер=0x00000008, fileOffset=0x00008000, тип=28 __DATA/__data адрес=0x100008040, размер=0x025047A0, fileOffset=0x00008040, тип=0 ld: относительная ссылка 32-битного RIP выходит за пределы диапазона (-4256167970 максимум +/-2 ГБ): от _main (0x100003F70) до _kEmbeddedDataPack_sz (0x02504760) в '_main' из /Users/nickko/Library/Developer/Xcode/DerivedData/ TestApp-fmueotrdocmveqccnonnadmvuhpd/Build/Intermediates.noindex/TestApp.build/Debug/TestApp.build/Objects-normal/x86_64/main.o Для справки, это ассемблерный файл, который я генерирую:
.data .balign 64 .global _kEmbeddedDataPack _kEmbeddedDataPack: .incbin "mydata.bin" .global _kEmbeddedDataPack_end _kEmbeddedDataPack_end: .global _kEmbeddedDataPack_sz .set _kEmbeddedDataPack_sz, . - _kEmbeddedDataPack Я пробовал собрать с помощью -fno-pic -fno-pie -no-pie, но это не решило проблему. Я также пытался выполнить сборку с параметром -mcmodel=large, но это вызывает другую ошибку компоновщика.
Можно ли как-нибудь успешно связать это решение? Я бы хотел придерживаться подхода создания ассемблерного файла, если это возможно, потому что я также нацелен на другие платформы с помощью clang (не только XCode/Mac).
Спасибо за помощь.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение