Android NDK — символы __sfp и __sflag несовместимы с 64-битным

#c #c #android-ndk #ndk-build #bionic

#c #c #android-ndk #ndk-сборка #bionic

Вопрос:

Приложение поддерживает до 32 бит. Проблема при переходе с 32-битного (armeabi-v7a) на 64-битный (arm64-v8a).

 Issue - assertion "orig___sfp" failed
 

В проекте используются два символа __sfp и __sflag. Они отлично работают с 32-битным. Эти символы используются в одной функции.

 int flags, oflags;

if ((flags = orig___sflags(mode, amp;oflags)) == 0)
    return (NULL);

my_FILE *fp;
    if ((fp = (my_FILE *)orig___sfp()) == NULL)
        return (NULL);
 

Эти символы скрыты, их можно найти по ссылкам ниже.
https://android.googlesource.com/platform/bionic/ /50a7621b3fc493ffbb72aa23e29a4f1727dc1f51/libc/stdio/local. h
https://android.googlesource.com/platform/bionic / /a818445^!/

Кто-нибудь может знать, какие символы заменяются в этом месте? Какие из них совместимы с 64-битным?

Комментарии:

1. orig___sflags должна быть внутренняя функция, пожалуйста, проверьте, как контролируются возвращаемые значения в 32-битном и 64-битном режимах компиляции

2. Вы заметили, что все эти символы в опубликованной вами ссылке помечены __LIBC32_LEGACY_PUBLIC__ тегами? У вас не будет их в 64-разрядных реализациях. В зависимости от специфичных для реализации особенностей внутренних объектов, таких как FILE структуры, это в корне неверно, и это кусает вас здесь. Не делайте этого, и у вас не будет этих проблем.

3. да, я заметил это__LIBC32_LEGACY_PUBLIC__ . Но от него зависит несколько функций. Итак, ищем совместимые символы.

4. Вы планируете повторить ту же ошибку, полагаясь на внутренние детали реализации, которые, очевидно, могут и изменяются?