Пишем «Hello, World!» на Си для OpenWRT
Результат
Краткая история
Мне стало интересно, как можно скомпилировать код на языке Си для OpenWRT на мой роутер.
В интернете инструкции имеются, но расплывчатые и то им уже по 6–8 лет. Поэтому, в этой статье собрана актуальная информация по компиляции.
Требования
WSL (с Ubuntu 22.04+)
(либо VDS/VPS, если по какой-то причине нет возможности установить WSL)
Ищем OpenWRT-SDK
Но, самое важное, стоит учесть, что в зависимости от target platform, скомпилированная вами программа может не подойти всем роутерам одновременно. Это означает, что если вы компилируете из под openwrt-sdk для ath79, то для роутера на платформе (к примеру) arm либо at91 ваша программа работать не будет.
И так, для начала определим target platform. Сделать это можно двумя способами.
Посмотрим в веб-интерфейсе openwrt
Подключаемся к роутеру по ssh и вводим:
cat /etc/openwrt_release
Определили, дальше ищем OpenWRT-SDK под эту платформу.
По ссылке: https://downloads.openwrt.org/releases/
Как искать?
После перехода по ссылке, ищем версию OpenWRT установленную на нашем роутере. У меня это была 23.05.3
Жмем targets
Исходя из target platform смотрим какая у вас архитектура, у меня это ath79, я ищу её и перехожу по ней
Дальше обращаемся снова к target platform, во второй части написан тип, у меня это generic, переходим к нему
Переходим в самый низ и находим надпись: Supplementary Files
Ищем openwrt-sdk-…
Нажимаем по найденному openwrt-sdk ПКМ и копируем ссылку
Установка OpenWRT-SDK
Переходим к WSL (
cmd.exe -> wsl
)Скачаем 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
Распакуйте 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 минутПереходим в распакованную директорию SDK. Используем
cd filename
.
Пример:cd openwrt-sdk-23.05.4-ath79-generic_gcc-12.3.0_musl.Linux-x86_64
Добавляем пути к компилятору в переменную 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 это переменная в линуксе, которая содержит абсолютный путьПроверим, что всё сделано правильно:
mips-openwrt-linux-gcc --version
Выведет такую информацию
Компилируем код
Не забудьте выйти из папки компилятора:
cd ..
Создаем файл
hello.c
используя:> hello.c
Откройте его через vi или nano (либо иной другой редактор).
Если это создает сложности, можете перейти в проводнике Windows по пути:C:\Users\UserName
и найтиhello.c
там, дальше открыв любым удобным редакторомВставляем:
#include
int main()
{
printf("Hello, World!\n");
return 0;
}Сохраняем
Компилируем:
mips-openwrt-linux-gcc -o hello hello.c
Готово
Проверяем 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
Готово!