Ошибка сегмента libsodium на ARMv5

Я могу прекрасно использовать libsodium 1.0.7 в Ubuntu, но, похоже, возникают некоторые проблемы при попытке кросс-компилировать библиотеку libsodium в архитектуру armv5 (armv5tejl-unknown-linux-gnueabihf). Я использовал ./configure --host=armv5tejl-unknown-linux-gnueabihf, а затем make DESTDIR=/home/myself/ARM/.

Все файлы генерируются нормально (заголовки, файлы статических и общих библиотек), и я могу скомпилировать и связать небольшую тестовую C-программу, которая затем генерирует ошибку сегментации при выполнении на моей цели ARMv5 (toolchain и все в порядке, все остальное я компилирую & ссылка, не использующая libsodium, отлично работает на моей машине ARM):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sodium.h"
int main()
{
  printf("sodium_init()=%d\n",sodium_init()); // Fine, = 0
  unsigned char pbk[crypto_box_PUBLICKEYBYTES];
  unsigned char sbk[crypto_box_SECRETKEYBYTES];
  crypto_box_keypair(pbk,sbk); // <-- Segmentation fault.
}

Я также пробовал использовать официальные инструкции по кросс-компиляции для ARM по адресу https://download.libsodium.org/doc/installation/index.html, но настроить не удается из-за отсутствия файла nosys.specs. Есть ли где-нибудь, где я могу скачать это (я просмотрел его, и кажется, что он должен быть специально сгенерирован для пакета libsodium)?


person Tias    schedule 11.12.2015    source источник
comment
Просто чтобы быть уверенным, вы также должны показать #include, чтобы сделать ваш пример автономным. Может проблема в нем?   -  person 5gon12eder    schedule 11.12.2015
comment
Привет ! Вы совершенно правы, вот такие включения: 15) с натрием, созданным для Ubuntu), но не в целевой системе ARMv5 (с файлами библиотеки натрия, созданными для системы ARMv5)   -  person Tias    schedule 11.12.2015
comment
Пожалуйста, отредактируйте свой вопрос вместо того, чтобы публиковать код в виде комментариев.   -  person 5gon12eder    schedule 11.12.2015
comment
Прости за это. Хотя я просто ответил нормально.   -  person Tias    schedule 12.12.2015
comment
Как вы пришли к тому, что armv5tejl-unknown-linux-gnueabihf является правильным вариантом для вашей цели?   -  person unixsmurf    schedule 13.12.2015
comment
Привет! Пожалуйста, закройте эту тему, мне удалось решить ее с некоторой помощью здесь: github.com/jedisct1 /libsodium/issues/331   -  person Tias    schedule 13.12.2015
comment
Ну, это никогда не было проблемой :) Это набор инструментов, поставляемый с целевой системой, для которой я разрабатываю свое ПО. Ваше здоровье !   -  person Tias    schedule 13.12.2015


Ответы (1)


Мне удалось решить эту проблему с помощью здесь: github.com/jedisct1/libsodium/issues/331 Тиас

Хорошо, мне наконец удалось запустить его на моей цели ARMv5, выполнив следующие действия, большое спасибо за то, что указали мне на цепочку инструментов ARM, содержащую файлы nosys.spec и libnosys.a:

Примечание. Это для создания статического libsodium.a

Пример ниже предполагает, что домашняя папка = /home/user

tar xvjf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
tar xvzf libsodium-1.0.7.tar.gz
cp ./gcc-arm-none-eabi-4_9-2015q3/arm-none-eabi/lib/nosys.spec ./libsodium-1.0.7/
cp ./gcc-arm-none-eabi-4_9-2015q3/arm-none-eabi/lib/libnosys.a ./libsodium-1.0.7/ 

Папку gcc-arm-none-eabi-4_9-на этом этапе можно удалить.

cd ./libsodium-1.0.7/
mkdir ARMv5
export LDFLAGS='-static -g --specs=nosys.specs -L/home/user/libsodium-1.0.7/ -lnosys -lc'
./configure --host=armv5tejl-unknown-linux-gnueabihf --enable-static --prefix=/home/user/libsodium-1.0.7/ARMv5/
make DESTDIR=/home/user/libsodium-1.0.7/ARMv5/ 

Ключевые открытия для меня:

  • Подсказка от jedisct1, где взять набор инструментов ARM, содержащий файлы nosys.spec и libnosys.a.
  • Обнаружено, что нужно добавить флаг компоновщика -lc, чтобы сделать libsodium с libc (содержащий __libc_start_main, abort, __libc_csu_fini и __libc_csu_init)

person Community    schedule 11.10.2017