Результат
Результат

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

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

Требования

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

Ищем OpenWRT-SDK

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

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

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

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

Определили, дальше ищем 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-....

  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 <stdio.h>
    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

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

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

Вводим ./hello

Готово!
Готово!

Комментарии (7)


  1. coodi
    09.08.2024 14:00
    +1

    Как все сложно. Раньше у них был гайд, как собирать и удаленно отлаживать приложение на роутере через эклипс. И это работало


    1. coodi
      09.08.2024 14:00

      https://web.archive.org/web/20170829085303/https://downloads.openwrt.org/docs/eclipse.pdf


    1. VadimBoev Автор
      09.08.2024 14:00

      полезно, спасибо


    1. AndreyFr
      09.08.2024 14:00

      Че ж тут сложного. Это просто первые подготовительные шаги.


  1. freemorger
    09.08.2024 14:00
    +7

    Вместо WSL можно просто винду снести и линукс поставить. Я так давно сделал. Впрочем, выбор каждого


  1. salieff
    09.08.2024 14:00

    Очень мудрено описана простейшая история про то, как на хостовом линуксе, с помощью кросс-тулчейна, собрать бинарь, по scp закинуть его на целевой линукс, и там запустить.
    Три короткие, очевидные, консольные команды.
    Хотя, зашоренному кругозору пользователей WSL, похоже, любое действие, отличное от тыкания F5 в Visual Studio, кажется непостижимой магией :-D


    1. alelam
      09.08.2024 14:00
      +1

      Не нашел тут ничего мудрённого. Главное расписано - как родной сдк искать и как начать с ним работать. Про всл очень душно вышло. Я например с 2012 года на убунту. Между 2015 и 2020 прилично времени на openWRT потратил и "собирание бинарей в тулчейне хоста и закидывание их на таржет", поэтому пришлось по ссылке перейти, чтобы узнать,что такое WSL. По-моему как раз в контексте тулчейнов openWRT нормальная тема для тех кому это эпизодически нужно и кто софтом рабочим к винде привязан.