LINUX.ORG.RU

Собрать статический бинарник для MIPS

 ,


0

2

Надо собрать transocks_ev статически для BL2348.

Поправил Makefile так

CC = mips-linux-gnu-gcc
LIBEVENT_DIR=/usr/mips-linux-gnu
LIBEVENT_STATIC_DIR=$(LIBEVENT_DIR)/lib
LIBEVENT_LIB_FILE=$(LIBEVENT_STATIC_DIR)/libevent.a
LIBC_FILE=$(LIBEVENT_STATIC_DIR)/libc.a
LIBRESOLV_FILE=$(LIBEVENT_STATIC_DIR)/libresolv.a
LIBPTHREAD_FILE=$(LIBEVENT_STATIC_DIR)/libpthread.a

LIBEVENT_INC_DIR=$(LIBEVENT_DIR)/include
CFLAGS = -g -O2 -DSOCKS -I$(LIBEVENT_INC_DIR)

OBJ = transocks_ev.o

all: transocks_ev

clean:
	rm -f *.o transocks_ev

transocks_ev: $(OBJ)
	$(CC) -o transocks_ev $(OBJ) \
	-L$(LIBEVENT_STATIC_DIR) \
	-static \
	-Wl,-Bstatic \
	-Wl,--rpath -Wl,$(LIBEVENT_STATIC_DIR) \
	$(LIBEVENT_LIB_FILE) $(LIBC_FILE) $(LIBRESOLV_FILE) $(LIBPTHREAD_FILE)

.c.o:
	$(CC) -c $(CFLAGS) $<

Собираю

$ make -j5
mips-linux-gnu-gcc -c -g -O2 -DSOCKS -I/usr/mips-linux-gnu/include transocks_ev.c
transocks_ev.c: In function ‘main’:
transocks_ev.c:927:51: warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
       fprintf (stderr, "can't open /dev/urandom: %s (%d). continuing, but will not randomize dns replies.\n");
                                                  ~^
transocks_ev.c:927:55: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
       fprintf (stderr, "can't open /dev/urandom: %s (%d). continuing, but will not randomize dns replies.\n");
                                                      ~^
mips-linux-gnu-gcc -o transocks_ev transocks_ev.o \
-L/usr/mips-linux-gnu/lib \
-static \
-Wl,-Bstatic \
-Wl,--rpath -Wl,/usr/mips-linux-gnu/lib \
/usr/mips-linux-gnu/lib/libevent.a /usr/mips-linux-gnu/lib/libc.a /usr/mips-linux-gnu/lib/libresolv.a /usr/mips-linux-gnu/lib/libpthread.a
/usr/mips-linux-gnu/lib/libevent.a(evutil.o): In function `test_for_getaddrinfo_hacks':
/home/homa/Документы/code/tranSOCKS_ev/libevent-2.1.12-stable/evutil.c:1300: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/mips-linux-gnu/lib/libevent.a(evutil.o): In function `evutil_unparse_protoname':
/home/homa/Документы/code/tranSOCKS_ev/libevent-2.1.12-stable/evutil.c:928: warning: Using 'getprotobynumber' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/mips-linux-gnu/lib/libevent.a(evutil.o): In function `evutil_parse_servname':
/home/homa/Документы/code/tranSOCKS_ev/libevent-2.1.12-stable/evutil.c:913: warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$ readelf -Wd transocks_ev

В этом файле нет динамического раздела.
При запуске на целевом железе (SOHO-роутере) получаю
>./transocks_ev    
Segmentation fault

iliyap

★★★

fprintf (stderr, «can't open /dev/urandom: %s (%d). continuing, but will not randomize dns replies.\n»);

Это либо мёртвый проект с тех времён когда gcc не имел опции -Wformat, либо его автор профнепригоден, раз не постыдился опубликовать исходник, зная про этот варнинг или вообще собирая без него.

А ты, вместо того чтоб сказал «фу гадость» и сделать rm -Rf тарболлу и его содержимому, всё равно пытаешься с ним что-то делать, это тоже фу.

firkax ★★★★★
()

Поставь тулчейн openwrt.

Shadow ★★★★★
()

Segmentation fault

Нужен бэктрейс. Получить его можно запустив свой бинарник под gdb (или gdbserver), либо записать корку и раскрутить её на хосте с помощью кроссового gdb

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 2)

Надо собрать кордамп. ulimit -c unlimited до запуска бинарника позволит ядру отписать кордамп. Скопируешь его на ПК, запустишь mips-linux-gnu-gdb transocks_ev core, посмотришь где случился сегфолт.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

Не получается собрать дамп.

ulimit -c unlimited

Сделал. Вывод пустой.

>cat /proc/sys/kernel/core_pattern
/tmp/core
>ulimit -a
time(seconds)        unlimited
file(blocks)         unlimited
data(kb)             unlimited
stack(kb)            2040
coredump(blocks)     0
memory(kb)           unlimited
locked memory(kb)    32
process              416
nofiles              1024
vmemory(kb)          unlimited
locks                unlimited
>./transocks_ev
Segmentation fault
>ls /tmp/core
ls: /tmp/core: No such file or directory
damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

В /tmp есть права на запись? А места там достаточно (размер корки равен VmSize процесса)? Возможно, придётся подключать флешку и писать на неё.

Вот что нашлось в инете: https://stackoverflow.com/questions/7732983/core-dump-file-is-not-generated/16380374#16380374.

annulen ★★★★★
()
Ответ на: комментарий от damix9

Ещё я бы советовал включать в core_pattern pid и название бинарника, например

/tmp/core.%e.%p

См. man core

annulen ★★★★★
()
Ответ на: комментарий от damix9

Или, вместо попыток записать корку, запускать под gdbserver. Но для этого нужно собрать сам gdbserver и поместить его на девайс, а потом подключаться к нему с хостового mips-linux-gnu-gdb

annulen ★★★★★
()
Ответ на: комментарий от annulen

Было недостаточно места в на разделе, где /tmp.

Сейчас пишу на флешку, но

>cat /proc/sys/kernel/core_pattern
/tmp/usb/usb1_1/core.%e.%p
>./transocks_ev
Segmentation fault
>ls -al /tmp/usb/usb1_1
drwxrwxrwx    1 root     root          208 Aug 24 01:58 .
...
файла там нет.

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

Вообще при записи корки сообщение должно выглядеть как Segmentation fault (core dumped)

Надо пройтись по списку возможных причин из ссылки выше. Для начала, я бы сделал touch /tmp/usb/usb1_1/a, а то вдруг туда нет прав на запись под текущим юзером, или каталог в пути не создан.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Тогда мне придется сначала собрать и отладить gdbserver.

Вообще наверное собирать статически с libc - плохая идея.

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

Тогда мне придется сначала собрать и отладить gdbserver.

Если бы был «родной» тулчейн от прошивки, которая соит на железке, то это было бы тривиально.

Вообще наверное собирать статически с libc - плохая идея.

It depends. Если нет «родного» тулчейна, и приложение состоит из одного бинарника, то это хороший вариант. Мешать отладке это не должно, особенно если всё собрано с -g.

annulen ★★★★★
()
Ответ на: комментарий от damix9

Предлагаю простой тест: собрать и запустить hello world. Если тоже упадёт, тогда браться за gdbserver рано

annulen ★★★★★
()
Ответ на: комментарий от annulen

touch /tmp/usb/usb1_1/a

Файл создается.

а то вдруг туда нет прав на запись под текущим юзером

Я под рутом.

damix9 ★★★
() автор топика
Ответ на: комментарий от annulen

Если бы был «родной» тулчейн от прошивки, которая соит на железке, то это было бы тривиально.

Вот я лучше найду этот тулчейн или другую железку, для которой есть тулчейн.

собрать и запустить hello world

count_program.c

#include <stdio.h>

int main() {
    int i;
    printf("Counting from 0 to 9:\n");
    for (i = 0; i <= 9; i++) {
        printf("%d\n", i);
    }
    return 0;
}
mips-linux-gnu-gcc -c -g -O2 -I/usr/mips-linux-gnu/include count_program.c
mips-linux-gnu-gcc -o count_program count_program.o -L/usr/mips-linux-gnu/lib -static -Wl,-Bstatic -Wl,/usr/mips-linux-gnu/lib/libc.a

$ readelf -Wd count_program

В этом файле нет динамического раздела.

$ file count_program
count_program: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=f76be5cc17184b5c6e65f9edc690aa69c11893bf, with debug_info, not stripped

Сегфолтится.

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

Из этого ясно, что проблема в процессе сборки. Не обязательно тулчейн совсем неподходящий, но что-то неправильно.

А что показывает file, если натравить его на работающие бинарники в системе?

annulen ★★★★★
()
Ответ на: комментарий от annulen

А что показывает file, если натравить его на работающие бинарники в системе?

В системе роутера?

damix9 ★★★
() автор топика
Ответ на: комментарий от annulen

В той системе file нет, но если взять бинарник оттуда и положить на обычный ПК, то вот

$ file busybox 
busybox: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

damix9 ★★★
() автор топика
Ответ на: комментарий от annulen
$ mips-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/mips-linux-gnu/7/lto-wrapper
Target: mips-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libsanitizer --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --enable-multiarch --disable-werror --enable-multilib --with-arch-32=mips32r2 --with-fp-32=xx --with-lxc1-sxc1=no --enable-targets=all --with-arch-64=mips64r2 --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=mips-linux-gnu --program-prefix=mips-linux-gnu- --includedir=/usr/mips-linux-gnu/include
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

MIPS32 version 1

MIPS32 rel2 version 1

Мне вот кажется, что это значит, что на роутере всё собрано под -march=mips32, а у тебя под -march=mips32r2. По-идее, от несовместимой архитектуры должен быть SIGILL, а не SIGSEGV, но чем чёрт не шутит.

annulen ★★★★★
()
Ответ на: комментарий от damix9

Ну да, –with-arch-32=mips32r2, т.е. это дефолтное значение

annulen ★★★★★
()
Ответ на: комментарий от annulen

На целевом

cat /proc/cpuinfo
system type             : Broadlight Jasmine (BL2348 Evaluation) board
processor               : 0
cpu model               : MIPS 24K V7.12
BogoMIPS                : 297.98
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 16
extra interrupt vector  : yes
hardware watchpoint     : yes
ASEs implemented        : mips16
VCED exceptions         : not available
VCEI exceptions         : not available

damix9 ★★★
() автор топика
Ответ на: комментарий от annulen
mips-linux-gnu-gcc -c -g -O2 -DSOCKS -I/usr/mips-linux-gnu/include -march=mips32 transocks_ev.c

Дальше слинковал так же.

$ file transocks_ev                                                                                                                                                                                   
transocks_ev: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=77da1686351dce23321c3db3b008c8649ac8a552, with debug_info, not stripped
Но получил то же самое.

А вот у меня на целевом устройстве ядро более старое, чем 3.2.0. Это имеет какое-то значение?

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

Но получил то же самое.

А ну да, конечно. У тебя в приложение линкуется libc из тулчейна, а она тоже собрана для mips32r2. Поэтому слинкованный бинарник получился опять для mips32r2.

С другой стороны, судя по названию процессора, он должен быть как раз таки mips32r2. Но мне бы хотелось увидеть в деле бинарник с «MIPS32 version 1» прежде чем отбрасывать эту версию.

А вот у меня на целевом устройстве ядро более старое, чем 3.2.0. Это имеет какое-то значение?

Возможно.

Надо собирать свой тулчейн под свою версию ядра. Для этого можно использовать, например, crosstool-ng или busybox. Или crossdev в Gentoo. Заодно, в качестве libc взять uClibc той же версии, которая лежит в /lib. Тогда, возможно, будут работать динамические бинарники.

annulen ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.