ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: Aleksey82  
Дата: 13.05.21 19:17
Оценка:
Всем привет

Пытаюсь сбилдить дебажную версию libreOffice для андроида под ubuntu. Получаю ошибку линковки

/home/alex/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld.gold: internal error in fix_errata_and_relocate_erratum_stubs, at /buildbot/src/android/binutils/toolchain/binutils/binutils-2.27/gold/aarch64.cc:2006


Может кто-то сталкивался? Как это побороть?

Настройка autogen:
./autogen.sh --with-distro=LibreOfficeAndroidAarch64 -with-android-sdk=/home/alex/Android/Sdk --with-android-ndk=/home/alex/Android/Sdk/ndk/22.1.7171670 --enable-debug

пробовал менять версию ndk, все равно ошибка линковки, только не fix_errata_and_relocate_erratum_stubs а другое имя
Отредактировано 13.05.2021 19:18 Aleksey82 . Предыдущая версия .
Re: ld.gold: internal error in fix_errata_and_relocate_errat
От: Zhendos  
Дата: 14.05.21 13:45
Оценка: 4 (1)
Здравствуйте, Aleksey82, Вы писали:

A>Всем привет


A>Может кто-то сталкивался? Как это побороть?


Я не сталкивался, но в составе NDK есть еще и стардантный линковщик ld.bfd,
он медленее чем ld.gold, но багов ld.gold не имеет. Попробуйте задать через переменную LD
путь до него при вызове configure, ну или может у configure от openoffice есть нужная опция.
Отредактировано 07.10.2021 15:02 Zhendos . Предыдущая версия . Еще …
Отредактировано 07.10.2021 15:02 Zhendos . Предыдущая версия .
Re[2]: ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: Aleksey82  
Дата: 14.05.21 21:46
Оценка:
Здравствуйте, Zhendos, Вы писали:

Нашел в мейкфайле. Глобальная опция по выбору линковщика есть, но в папке с android частью лежит мейкфайл с захардкоженным ld.gold

Вот так выглядит этот кусок:

$(OBJLOCAL)/liblo-native-code.so : native-code.cxx $(ALL_STATIC_LIBS)
    @echo "Linking $@"
    mkdir -p $(OBJLOCAL)
    $(CXX) -fuse-ld=gold -Wl,--build-id=sha1 -Wl,--gc-sections -Wl,--version-script=../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -Wl,-soname,liblo-native-code.so -o $(OBJLOCAL)/liblo-native-code.so -I$(BUILDDIR)/config_host -I$(SRCDIR)/include native-code.cxx -L$(INSTDIR)/$(LIBO_LIB_FOLDER) $(WHOLELIBS) $(LIBS) -lc++_static -lc++abi $(if $(filter-out arm64-v8a x86_64,$(ANDROID_APP_ABI)),-landroid_support) $(if $(filter armeabi-v7a,$(ANDROID_APP_ABI)),-lunwind) $(addprefix -l,$(NSSLIBS)) -lGLESv2 -landroid -ljnigraphics -llog -lz


Если попробовать -fuse-ld=ld.bfd то будет ошибка "неизвестное значение параметра fuse-ld" или как-то так

Если поставить -fuse-ld=lld то оно попробует слинковаться, но выпадет с внутренней ошибкой линковщика, что-то типа "адрес долджен быть в пределах от а до б, но он вышел за предел"

Второе вероятно потому что какая-то из библиотек была слинкована не с помощью lld...

Непонятно, зачем есть глобальный параметр выбора линкера, а для андроида они захардкодили gold
Re[3]: ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: Aleksey82  
Дата: 14.05.21 22:00
Оценка:
Вообще, этот файл называется Makefile.shared и полностью вот так выглядит

  содержимое мейкфайла
#
# Common Makefile pieces for building Java / Android apps.
#

#
# BOOTSTRAPDIR needs to be set to this directory before starting this
#

# Probably would be best to just stop fooling around with the possibilities to
# set various stuff with the -env command line parameters (and environment
# variables?) and in a plethora of rc files, and hardcode construction of
# *all* required pathnames based on the app installation location for Android
# (and iOS), etc. We don't really win anything by having so many layers of
# configurability on platforms like Android and iOS where apps based on LO
# code are very much self-contained pre-packaged thingies.

JNILIBSDIR=$(BUILDDIR)/android/jniLibs
SODEST=$(JNILIBSDIR)/$(ANDROID_APP_ABI)
OBJLOCAL=$(BUILDDIR)/android/obj/local/$(ANDROID_APP_ABI)

#
# Helpful rules ...
#

local.properties: $(BUILDDIR)/config_host.mk
    echo sdk.dir=$(ANDROID_SDK_HOME) >local.properties

#
# Build / link the single .so for this app
#

ALL_STATIC_LIBS := $(shell $(SRCDIR)/bin/lo-all-static-libs)

LIBS = \
  -Wl,--start-group \
  $(ALL_STATIC_LIBS) \
  -Wl,--end-group

NSSLIBS = freebl3 \
    nspr4 \
    nss3 \
    nssckbi \
    nssdbm3 \
    nssutil3 \
    plc4 \
    plds4 \
    smime3 \
    softokn3 \
    sqlite3 \
    ssl3 \

WHOLELIBS = \
  -Wl,--whole-archive \
  $(addprefix -l,$(strip \
    $(if $(ENABLE_JAVA),juh) \
  )) \
  -Wl,--no-whole-archive


$(OBJLOCAL)/liblo-native-code.so : native-code.cxx $(ALL_STATIC_LIBS)
    @echo "Linking $@"
    mkdir -p $(OBJLOCAL)
    $(CXX) -fuse-ld=gold -Wl,--build-id=sha1 -Wl,--gc-sections -Wl,--version-script=../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -Wl,-soname,liblo-native-code.so -o $(OBJLOCAL)/liblo-native-code.so -I$(BUILDDIR)/config_host -I$(SRCDIR)/include native-code.cxx -L$(INSTDIR)/$(LIBO_LIB_FOLDER) $(WHOLELIBS) $(LIBS) -lc++_static -lc++abi $(if $(filter-out arm64-v8a x86_64,$(ANDROID_APP_ABI)),-landroid_support) $(if $(filter armeabi-v7a,$(ANDROID_APP_ABI)),-lunwind) $(addprefix -l,$(NSSLIBS)) -lGLESv2 -landroid -ljnigraphics -llog -lz

$(SODEST)/liblo-native-code.so : $(OBJLOCAL)/liblo-native-code.so
    mkdir -p $(SODEST)
    $(STRIP) -o $(SODEST)/liblo-native-code.so $(OBJLOCAL)/liblo-native-code.so
    #to keep some symbols, eg.: $(STRIP) -o $(SODEST)/liblo-native-code.so $(OBJLOCAL)/liblo-native-code.so -w -K 'Java*'

$(SODEST)/nss-libraries : 
    mkdir -p $(SODEST)
    $(foreach lib,$(NSSLIBS),$(STRIP) -o $(SODEST)/lib$(lib).so $(INSTDIR)/$(LIBO_LIB_FOLDER)/lib$(lib).so;)

$(SODEST)/libc++_shared.so : $(ANDROID_NDK_HOME)/sources/cxx-stl/llvm-libc++/libs/$(ANDROID_APP_ABI)/libc++_shared.so
    mkdir -p $(SODEST)
    cp $< $@

link-so: $(SODEST)/liblo-native-code.so $(SODEST)/nss-libraries $(SODEST)/libc++_shared.so

# If you reinstall an app several times *on the emulator*, even if you
# uninstall it between, disk space seems to leak that won't get recycled until
# you stop and start... No idea if this holds for a device, too. (And you
# can't "stop" a device anyway.)

stop-start-cycle:
    $(ANDROID_SDK_HOME)/platform-tools/adb shell stop && $(ANDROID_SDK_HOME)/platform-tools/adb shell start && sleep 10

# build-host specific stuff (build paths and the like) to keep build.gradle static
liboSettings.gradle: $(BUILDDIR)/config_build.mk $(BUILDDIR)/config_host.mk
    @echo "creating $@"
    ( \
        echo "// created by Makefile.shared - your changes will be overridden" \
        && echo "ext {" \
        && echo "    liboSrcRoot         = '$(SRC_ROOT)'" \
        && echo "    liboJniLibsdir      = '$(JNILIBSDIR)'" \
        && echo "    liboWorkdir         = '$(WORKDIR)'" \
        && echo "    liboInstdir         = '$(INSTDIR)'" \
        && echo "    liboEtcFolder       = '$(LIBO_ETC_FOLDER)'" \
        && echo "    liboUreMiscFolder   = '$(LIBO_URE_MISC_FOLDER)'" \
        && echo "    liboSharedResFolder = '$(LIBO_SHARE_RESOURCE_FOLDER)'" \
        && echo "    liboUREJavaFolder   = '$(LIBO_URE_SHARE_JAVA_FOLDER)'" \
        && echo "    liboShareJavaFolder = '$(LIBO_SHARE_JAVA_FOLDER)'" \
        && echo "    liboExampleDocument = '$(if $(exampleDocument),$(exampleDocument),$(SRC_ROOT)/android/default-document/example.odt)'" \
        && echo "    liboVersionMajor    = '$(LIBO_VERSION_MAJOR)'" \
        && echo "    liboVersionMinor    = '$(LIBO_VERSION_MINOR)'" \
        && echo "    liboGitFullCommit   = '$(shell cd $(SRCDIR) && git log -1 --format=%H)'" \
        && echo "}" \
        && echo "android.defaultConfig {" \
        && echo "    applicationId '$(ANDROID_PACKAGE_NAME)'" \
        && echo "    versionCode project.hasProperty('cmdVersionCode') ? cmdVersionCode.toInteger() : $(if $(versionCode),$(versionCode),1)" \
        && echo "    versionName '$(LIBO_VERSION_MAJOR).$(LIBO_VERSION_MINOR).$(LIBO_VERSION_MICRO).$(LIBO_VERSION_PATCH)$(LIBO_VERSION_SUFFIX)$(LIBO_VERSION_SUFFIX_SUFFIX)/$(shell cd $(SRCDIR) && git log -1 --format=%h)/$(OOO_VENDOR)'" \
        && echo "}" \
    ) > $@


А можно как-то задать путь к конкретному ld.gold ? Оно является частью binutils? Вроде как есть новые версии binutils и там могут быть пофикшены баги. На сайте https://ftp.gnu.org/gnu/binutils/ есть архивы, только я чайник в линухе и не знаю что с ними делать)
Re[3]: ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: Aleksey82  
Дата: 15.05.21 08:20
Оценка:
A>Если поставить -fuse-ld=lld то оно попробует слинковаться, но выпадет с внутренней ошибкой линковщика, что-то типа "адрес долджен быть в пределах от а до б, но он вышел за предел"

ld.lld: error: relocation R_AARCH64_JUMP26 out of range: -162754404 is not in [-134217728, 134217727]


не получается линковать чем-то другим...
Re: ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: reversecode google
Дата: 15.05.21 08:56
Оценка:
никак
открываем гугл
находим фикс
http://sourceware-org.1504.n7.nabble.com/PATCH-gold-Fix-aarch64-fix-errata-and-relocate-erratum-stubs-internal-error-td465738.html

открываем андроидовский тоолс
https://android.googlesource.com/toolchain/binutils/+/refs/heads/binutils-2_27-branch/gold/aarch64.cc#2034
и видим что гугл этот фикс к себе не вносил

закрываем весь спам по интернету который вы нафлудили


вы с 12 года в на форуме и как минимум в ИТ
что вы в нем делаете если не способны решать вопросы даже через гугл?
Re[2]: ld.gold: internal error in fix_errata_and_relocate_erratum_s
От: Aleksey82  
Дата: 15.05.21 09:22
Оценка:
R>вы с 12 года в на форуме и как минимум в ИТ
R>что вы в нем делаете если не способны решать вопросы даже через гугл?

Так и в чем решение? Я тоже вижу что есть какая-то ошибка в бинутилсах, и что? Решить-то как? Мне надо эту фигню сбилдить

А выпендриваться в подворотне перед собутыльниками можешь
Re: заработало
От: Aleksey82  
Дата: 16.05.21 16:13
Оценка: 2 (1)
В общем, если вдруг кому поможет

Качаем binutils версию 2.36 (может можно и более позднюю) https://ftp.gnu.org/gnu/binutils/
Распаковываем куда-то. В распакованной папке делаем
./configure
make
make install
Либо почитать процесс установки в readme в распакованном архиве
Эта тулза нужна, потому что дебажный билд под андроид не линковался, выдавал ошибку в ld.gold.
ld.gold это линкер (экспериментальный), его вызов находится в
/home/alex/libre8/android/Bootstrap/Makefile.shared
$(OBJLOCAL)/liblo-native-code.so : native-code.cxx $(ALL_STATIC_LIBS)
@echo "Linking $@"
mkdir -p $(OBJLOCAL)
$(CXX) -fuse-ld=gold -Wl,--build-id=sha1 -Wl,--gc-sections……

После того как сбилдили и установили binutils, отключаем тот binutils который берется билдом, он лежит в /home/alex/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/bin — тут удалить ld.gold (переименовать) и тогда если глобально(?) установлен другой ld.gold то взлетит

Затем
> ./autogen.sh --with-distro=LibreOfficeAndroidAarch64 -with-android-sdk=/home/alex/Android/Sdk --with-android-ndk=/home/alex/Android/Sdk/ndk/20.0.5594570 --enable-dbgutil --enable-werror
> make

В андроид студии делаем инструкцию из
https://docs.libreoffice.org/android.html — Using Android Studio (and Thus lldb)
Параметры из инструкции
command script import /home/alex/libre8/solenv/lldb/libreoffice/LO.py

Надо на вкладке debug переставить на Java + Native

Вероятно дебаг еще не запустится, надо :
Проверить что adb установлен, например исполнить adb devices

Если в андроид студии пощелкать по вкладкам внизу, там есть подвкладка lldb и на ней может быть ошибка «error while loading shared libraries: libncurses.so.5:»
тогда https://stackoverflow.com/questions/17005654/error-while-loading-shared-libraries-libncurses-so-5

If libncurses is not installed then install it and try again.
for 32-bit binaries : sudo apt-get install libncurses5:i386
for 64-bit binaries : sudo apt-get install libncurses5
Also install the collection of libraries by using this command,
sudo apt-get install ia32-libs – это не сработала, но в итоге не помешало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.