Пишем «Hello, World!» на Си для OpenWRT

Результат

Результат

Краткая история

Мне стало интересно, как можно скомпилировать код на языке Си для OpenWRT на мой роутер.
В интернете инструкции имеются, но расплывчатые и то им уже по 6–8 лет. Поэтому, в этой статье собрана актуальная информация по компиляции.

Требования

  • WSL (с Ubuntu 22.04+)
    (либо VDS/VPS, если по какой-то причине нет возможности установить WSL)

Ищем OpenWRT-SDK

Но, самое важное, стоит учесть, что в зависимости от target platform, скомпилированная вами программа может не подойти всем роутерам одновременно. Это означает, что если вы компилируете из под openwrt-sdk для ath79, то для роутера на платформе (к примеру) arm либо at91 ваша программа работать не будет.

И так, для начала определим target platform. Сделать это можно двумя способами.

  1. Посмотрим в веб-интерфейсе openwrt

    7f4a9b2455a30f98231bf8127155cafa.png
  2. Подключаемся к роутеру по ssh и вводим: cat /etc/openwrt_release

    9ce15963e656d14a3d6813c2d992cedb.png

Определили, дальше ищем OpenWRT-SDK под эту платформу.
По ссылке: https://downloads.openwrt.org/releases/

Как искать?

  1. После перехода по ссылке, ищем версию OpenWRT установленную на нашем роутере. У меня это была 23.05.3

  2. Жмем targets

  3. Исходя из target platform смотрим какая у вас архитектура, у меня это ath79, я ищу её и перехожу по ней

  4. Дальше обращаемся снова к target platform, во второй части написан тип, у меня это generic, переходим к нему

  5. Переходим в самый низ и находим надпись: Supplementary Files

  6. Ищем openwrt-sdk-…

    1d2cb2745af4cdaccbcd54721275c27d.png
  7. Нажимаем по найденному openwrt-sdk ПКМ и копируем ссылку

Установка OpenWRT-SDK

  1. Переходим к WSL (cmd.exe -> wsl)

  2. Скачаем OpenWRT-SDK. Для этого используем wget link и вместо слова link вставляем ссылку просто тыкнув ПКМ. К примеру, должно получится так:
    wget https://downloads.openwrt.org/releases/23.05.4/targets/ath79/generic/openwrt-sdk-23.05.4-ath79-generic_gcc-12.3.0_musl.Linux-x86_64.tar.xz

  3. Распакуйте SDK. Для этого используем tar -xvf filename и вместо filename вставьте название файла который скачали. Пример:
    tar -xvf openwrt-sdk-23.05.4-ath79-generic_gcc-12.3.0_musl.Linux-x86_64.tar.xz
    p.s. распаковка может занять какое-то время, примерно 2–7 минут

  4. Переходим в распакованную директорию SDK. Используем cd filename .
    Пример: cd openwrt-sdk-23.05.4-ath79-generic_gcc-12.3.0_musl.Linux-x86_64

  5. Добавляем пути к компилятору в переменную PATH:
    export STAGING_DIR=$PWD/staging_dir
    export $PATH=$PWD/staging_dir/toolchain-mips_24kc_gcc-12.3.0_musl/bin
    p.s. я подозреваю, что пути могут немного отличаться, будьте внимательны
    p.s.s $PWD это переменная в линуксе, которая содержит абсолютный путь

  6. Проверим, что всё сделано правильно:
    mips-openwrt-linux-gcc --version

    Выведет такую информацию

    Выведет такую информацию

Компилируем код

  1. Не забудьте выйти из папки компилятора: cd ..

  2. Создаем файл hello.c используя: > hello.c

  3. Откройте его через vi или nano (либо иной другой редактор).
    Если это создает сложности, можете перейти в проводнике Windows по пути: C:\Users\UserName и найти hello.c там, дальше открыв любым удобным редактором

  4. Вставляем:
    #include
    int main()
    {
    printf("Hello, World!\n");
    return 0;
    }

  5. Сохраняем

  6. Компилируем: mips-openwrt-linux-gcc -o hello hello.c

  7. Готово

Проверяем Hello World на OpenWRT

Нам нужно любым способом доставить полученный hello (бинарный файл) на наш роутер.
Самый удобный вариант как по мне это использование sFTP через FileZilla

Перед этим, надо установить сервер openssh-sftp. Весит он ~68 Килобайт.
Хватает ли у вас места? Смотрим через df -h на строке overlayfs:/overlay (у меня 1.1 Мегабайта свободно)
Вводим opkg update и после обновления пакетов вводим opkg install openssh-sftp-server

Скачиваем FileZilla. В ней Файл -> Менеджер Сайтов -> Новый сайт
В поле Хост вводим IP через который входим по ssh, Пользователь по умолчанию root, а пароль, думаю тут понятно. Далее соединяемся и попадаем в корень /root

6a713225146684952d446bfb5c26ca86.png

Теперь переносим файл hello в этот корень.

Возвращаемся к ssh роутера и даем права на выполнение: chmod +x hello

Вводим ./hello

Готово!

Готово!

© Habrahabr.ru