LINUX.ORG.RU
ФорумAdmin

Перенаправить трафик определенного сайта на socks proxy

 , ,


0

1

Есть роутер с таким процессором

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
сделал так.

А как автоматизировать включение прокси? И чтобы не нужно было настраивать прокси на каждом устройстве и в каждом приложении (а в каких-то приложениях и это и вовсе нельзя). SOCKS5 прокси слушает порт 1080 на ip 192.168.1.1/24. Надо, чтобы трафик, который идет со всех устройств этой сети на сайт example.com (видимо порт TCP 443), шел через этот прокси-сервер.

Я предположил, что нужно воспользоваться transocks_ev. README.

TL DR

Дальше идет попытка собрать эту прогу. Статически не собирается, ругань приведена далее в этом посте, динамически собирается, но не работает, redsocks ругается аналогично. Есть предположение, что бинарники, которые я запускаю, не того формата.

----

Поправил Makefile

CC = mipsel-linux-gnu-gcc
LIBEVENT_DIR=/usr/mipsel-linux-gnu
LIBEVENT_STATIC_DIR=$(LIBEVENT_DIR)/lib
LIBEVENT_LIB_FILE=$(LIBEVENT_DIR)/lib/libevent.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) \
	-Wl,-Bstatic \
	-Wl,--rpath -Wl,$(LIBEVENT_STATIC_DIR) \
	$(LIBEVENT_LIB_FILE)

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

Устанавливаю libevent

sudo apt install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar xvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable
./configure --host=mipsel-linux-gnu --disable-openssl --prefix=/usr/mipsel-linux-gnu
make -j5
sudo checkinstall
Затем в каталоге с сырцами
make -j5
Получил на выходе
mipsel-linux-gnu-gcc -c -g -O2 -DSOCKS -I/usr/mipsel-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");
                                                      ~^
mipsel-linux-gnu-gcc -o transocks_ev transocks_ev.o \
-L/usr/mipsel-linux-gnu/lib \
-Wl,-Bstatic \
-Wl,--rpath -Wl,/usr/mipsel-linux-gnu/lib \
/usr/mipsel-linux-gnu/lib/libevent.a
/usr/lib/gcc-cross/mipsel-linux-gnu/7/../../../../mipsel-linux-gnu/bin/ld: cannot find -lgcc_s
/usr/mipsel-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/mipsel-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/mipsel-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                                             
/usr/lib/gcc-cross/mipsel-linux-gnu/7/../../../../mipsel-linux-gnu/bin/ld: cannot find -lgcc_s                                       
collect2: error: ld returned 1 exit status                                                                                           
Makefile:16: recipe for target 'transocks_ev' failed                                                                                 
make: *** [transocks_ev] Error 1

★★★

Последнее исправление: damix9 (всего исправлений: 3)

Если собрать с таким мейкфайлом

CC = mipsel-linux-gnu-gcc
LIBEVENT_DIR=/usr/mipsel-linux-gnu
LIBEVENT_LIB_DIR=$(LIBEVENT_DIR)/lib
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_LIB_DIR) -Wl,--rpath -Wl,$(LIBEVENT_LIB_DIR) -levent

.c.o:
	$(CC) -c $(CFLAGS) $<
Компиляция проходит успешно и получается
$ file transocks_ev
transocks_ev: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=0390779f33d4f8373e65f08242a05500ddf3d762, with debug_info, not stripped
а если его положить на роутер и запустить, то
/mnt/rwdir/transocks_ev: line 1: syntax error: "(" unexpected

Еще по теме нагуглено

https://unix.stackexchange.com/questions/71429/redirect-all-non-local-traffic...

https://www.linuxquestions.org/questions/linux-newbie-8/please-help-with-ipta...

cast Kolins ValdikSS

damix9 ★★★
() автор топика
Последнее исправление: damix9 (всего исправлений: 1)

https://github.com/darkk/redsocks.git умеет перенаправлять tcp-соединения в socks5.

Если говорить про сайты и браузеры, то есть замечательное средство - автоконфигурация настроек прокси-сервера (Automatic proxy configuration URL).

Оно есть и в ручном варианте и через dhcp (wpad-url код 252).

Там можно объяснить браузеру на какой хост через какой тип проски-сервера и адрес/порт ходить.

function FindProxyForURL(url, host)
{
var proxy_yes = "SOCKS5 127.0.0.1:1080";
var proxy_no = "DIRECT";
if (shExpMatch(url, "https://*.gtv1.com/*")) { return proxy_yes; }
return proxy_no;
}

Только нужно поднять локальный http-сервер который отдает этот файл.

Я подправил ciadpi чтобы он мог работать в прозрачном режиме. Посмотри на github.com/vel21ripn/куда-то-там-дпи ветка rawtcp

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от damix9
DIRECT          Connections should be made directly, without any proxies
PROXY host:port The specified proxy should be used
SOCKS host:port The specified SOCKS server should be used
                Recent versions of Firefox support as well:

HTTP host:port  The specified proxy should be used
HTTPS host:port The specified HTTPS proxy should be used

SOCKS4 host:port, SOCKS5 host:port 
                The specified SOCKS server (with the specified SOCK version) should be used
vel ★★★★★
()
Ответ на: комментарий от vel

Ок. Но тогда непонятно, вот если на андроид-устройстве дать такой pac.js, то что произойдет? Не все же приложения умеют прокси. А если к прокси подключается не приложение, а какая-то там программа в составе ОС, то откуда она знает доменное имя? HTTPS же зашифрован.

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

Если кто-то не умеет (или умеет не в полном объеме), то таких заворачивать через iptables на «соксификатор».

в https имя хоста незашифровано.

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

Если кто-то не умеет (или умеет не в полном объеме), то таких заворачивать через iptables на «соксификатор».

Ну вот так желательно, тем более, что есть устройства, даже не умеющие PAC.JS.

damix9 ★★★
() автор топика

Попробовал redsocks из дебиановского пакета для mipsel, с ним похожая проблема

LD_LIBRARY_PATH=/dev/shm/var/tmp/usb/usb1_1 ./redsocks -t -c ./redsocks.conf
./redsocks: line 1: EL@04T�p4: not found
./redsocks: line 2: syntax error: "(" unexpected (expecting ")")

Вообще обе программы похожи выводом утилиты file

redsocks/usr/sbin/redsocks: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, BuildID[sha1]=fc6c55b2bbf07403ca5f6c08923dc08cb4241c89, for GNU/Linux 3.2.0, stripped

transocks_ev: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=0390779f33d4f8373e65f08242a05500ddf3d762, with debug_info, not stripped
а вот файл, который идет на этом железе, какой-то другой
ciadpi-mips: ELF 32-bit MSB shared object, MIPS, MIPS-I version 1 (SYSV), dynamically linked, stripped
Предполагаю, что мипс мипсу рознь.

Vsevolod-linuxoid mittorn

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

Родные бинарники MSB (т.е. big endian), твои бинарники LSB (т.е. little endian). Надо использовать другой тулчейн для сборки. Например mips-linux-gnu. Но если это роутер, то скорее mips-openwrt-linux-uclibc.

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

Пересобрал либу

sudo apt install gcc-mips-linux-gnu
make clean
./configure --host=mips-linux-gnu --disable-openssl --prefix=/usr/mips-linux-gnu
make -j5
sudo apt purge libevent-mips-dev
sudo checkinstall
Пересобрал прогу.

Makefile

CC = mips-linux-gnu-gcc
LIBEVENT_DIR=/usr/mips-linux-gnu
LIBEVENT_LIB_DIR=$(LIBEVENT_DIR)/lib
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_LIB_DIR) -Wl,--rpath -Wl,$(LIBEVENT_LIB_DIR) -levent

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

make -j5

Получил

$ file transocks_ev
transocks_ev: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=bd9a46fbef8b3bfa4ad0a21a9308e05ee674b77c, with debug_info, not stripped
Но если его выполнить на BL2348
>./transocks_ev 
sh: ./transocks_ev: not found
Хотя
>ls -l ./transocks_ev
-rwx------    1 root     root        67516 Aug 19 05:49 ./transocks_ev

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

Так бинарник-то у тебя динамические библиотеки использует. И в нем указан путь к динамическому линкеру ld.so. Вот его и не может найти ядро. Тебе надо понять, каким тулчейном собраны бинарники твоего роутера.

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

найди тулчейн с похожей версией компилятора от похожего процессора. Почти всегда не удаётся подобрать совместимый с libc тулчейн (uclibc не имеет стабильного ABI), но может быть повезёт т.к часто вся линейка SoC может использовать один тулчейн

mittorn ★★★★★
()

Ещё ты можешь собрать статический бинарь, но учти что памяти мало и glibc тяжёлый. Я иногда делал компромисные варанты, например libc свой, но часть либ из системы, чтобы уместиться в маленький флеш.
Ещё из статического бинаря не работает ресолвинг (спасибо glibc), тут я это решал (в гисте заглушки для исправения проблем и уменьшения размера бинаря при статической линковке glibc):
https://gist.github.com/mittorn/d7dc8f2a830f086cf74c73a9f65a2206

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

Я подправил ciadpi чтобы он мог работать в прозрачном режиме.

Нашел. А как запустить в прозрачном режиме?

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

Тебе надо понять, каким тулчейном собраны бинарники твоего роутера.

Как посмотреть?

Вот тут что-то лежит, похожее на ld

>ls /lib
art_test.ko                  libnsl-0.9.29.so
iptables                     libnsl.so.0
ld-uClibc-0.9.29.so          libpthread-0.9.29.so
ld-uClibc.so.0               libpthread.so.0
libc.so.0                    libresolv-0.9.29.so
libcrypt-0.9.29.so           libresolv.so.0
libcrypt.so.0                librt-0.9.29.so
libdl-0.9.29.so              librt.so.0
libdl.so.0                   libuClibc-0.9.29.so
libgcc_s.so                  libutil-0.9.29.so
libgcc_s.so.1                libutil.so.0
libiw.so                     libwpa_common.a
libiw.so.29                  libwpa_common.so
libm-0.9.29.so               libwpa_ctrl.a
libm.so.0                    libwpa_ctrl.so
libnetfilter_conntrack.so.1  modules
libnfnetlink.so.0

А нельзя указать другой линкер при сборке?

mittorn пишет:

Ещё ты можешь собрать статический бинарь, но учти что памяти мало и glibc тяжёлый. Я иногда делал компромисные варанты, например libc свой, но часть либ из системы, чтобы уместиться в маленький флеш.

Тут флеш всего 1.5 Мб, но есть подключенная USB флешка.

А что если libevent слинковать статически, а libc наоборот из системы?

Еще я заметил, что ciadpi-mips - MSB shared object, а мой файл - MSB executable. Может это имеет какое-то значение?

А средствами одних только iptables конечная задача не решается?

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

Вы слинковали для glibc, наверное (dynamically linked, interpreter /lib/ld.so.1), а у вас uclibc (ld-uClibc-0.9.29.so, libc.so.0).

Вам нужен подходящий тулчейн, именно с этой версией uclibc — у них нет бинарной совместимости между версиями.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 1)
Ответ на: комментарий от damix9

Как посмотреть?

Скопировать бинарник с роутера на свой писюк, запустить readelf -Wl <бинарник>, посмотреть содержимое хедера INTERP. Например, на x86_64 glibc системе там будет

# readelf -Wl /bin/ls
  INTERP         0x000318 0x0000000000000318 0x0000000000000318 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

ld-uClibc-0.9.29.so ld-uClibc.so.0

Видимо юзерспейс этого роутера собран с uClibc, а не с glibc. Нужен uClibc тулчейн.

А нельзя указать другой линкер при сборке?

Можно попробовать (man ld):

--dynamic-linker=file
    Set the name of the dynamic linker.  This is only meaningful
    when generating dynamically linked ELF executables.
    The default dynamic linker is normally correct;
    don't use this unless you know what you are doing.

Наверное можно скопировать файлы с роутера и попробовать соорудить подобие sysroot на сборочном хосте.

Еще я заметил, что ciadpi-mips - MSB shared object, а мой файл - MSB executable. Может это имеет какое-то значение?

Не имеет. Передай опцию -fPIE (Position Independent Executable) при линковке и твой бинарник тоже станет shared object.

А средствами одних только iptables конечная задача не решается?

Завернуть HTTP в SOCKS одним только iptables невозможно.

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

Вам нужен подходящий тулчейн, именно с этой версией uclibc

Как это гуглится?

https://uclibc.org/toolchains.html

If you want to be really lazy and start using uClibc right away without needing to compile your own toolchain or anything, you can grab a pre-compiled uClibc development system. These are currently available for arm, armeb, i386, mips, mipsel, powerpc, and sh4.

Note: that the images mentioned above are old and ment for demonstration purposes only.

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

Тулчейн должен предоставляться автором прошивки, либо же должен быть собран из исходников прошивки в процессе сборки.

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

Скопировать бинарник с роутера

Любой? Ну вот например

$ readelf -Wl busybox

Тип файла ELF — EXEC (Исполняемый файл)
Entry point 0x406d90
There are 7 program headers, starting at offset 52

Заголовки программы:
  Тип            Смещ.    Вирт.адр   Физ.адр    Рзм.фйл Рзм.пм  Флг Выравн
  PHDR           0x000034 0x00400034 0x00400034 0x000e0 0x000e0 R E 0x4
  INTERP         0x000114 0x00400114 0x00400114 0x00014 0x00014 R   0x1
      [Requesting program interpreter: /lib/ld-uClibc.so.0]
  LOAD           0x000000 0x00400000 0x00400000 0x8b894 0x8b894 R E 0x10000
  LOAD           0x08c000 0x0049c000 0x0049c000 0x01878 0x02be4 RW  0x10000
  DYNAMIC        0x000128 0x00400128 0x00400128 0x000d8 0x000d8 RWE 0x4
  GNU_EH_FRAME   0x08b870 0x0048b870 0x0048b870 0x00024 0x00024 R   0x4
  NULL           0x000000 0x00000000 0x00000000 0x00000 0x00000     0x4

 Соответствие раздел-сегмент:
  Сегмент Разделы...
   00     
   01     .interp 
   02     .interp .dynamic .hash .dynsym .dynstr .init .text .MIPS.stubs .fini .rodata .eh_frame_hdr 
   03     .eh_frame .ctors .dtors .jcr .data.rel.ro .data .rld_map .got .sdata .sbss .bss 
   04     .dynamic 
   05     .eh_frame_hdr 
   06

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

Ну вот в нём прошит путь к динамическому линкеру: /lib/ld-uClibc.so.0. Значит ты можешь при линковке своего бинарника добавить флаг gcc -Wl,--dynamic-linker=/lib/ld-uClibc.so.0 ... и в твоём бинарнике будет прошит такой же путь к динамическому линкеру. Будет ли работать твой бинарник? Это зависит.

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

Значит ты можешь при линковке своего бинарника добавить флаг gcc -Wl,--dynamic-linker=/lib/ld-uClibc.so.0 ...

Так?

CC = mips-linux-gnu-gcc
LIBEVENT_DIR=/usr/mips-linux-gnu
LIBEVENT_LIB_DIR=$(LIBEVENT_DIR)/lib
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_LIB_DIR) -Wl,--dynamic-linker=/lib/ld-uClibc.so.0 -Wl,--rpath -Wl,$(LIBEVENT_LIB_DIR) -levent

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

damix9 ★★★
() автор топика
Последнее исправление: damix9 (всего исправлений: 1)
Ответ на: комментарий от damix9

А что если libevent слинковать статически, а libc наоборот из системы?

А у тебя есть инклуды хотя бы к системному libc для начала?
Если у тебя есть usb - можешь хоть полноценную gentoo туда закидывать. У меня аналогичный девайс без usb и с парой мегабайт места на rw разделах (корень в cramfs или squashfs, не помню), пришлось выкручиваться чтобы вместить туда openssh.

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

погоняй strings по файлам из роутера, скорее всего найдёшь версию компилятора и триплет точный. Дальше ищешь его в интернете (напрмер строчка «index of» «mips-linux-uclibc» «4.7.2» или то-то подобное, поиск по гитхабу тоже стоит сделать). Т.к в гугле совсем поломали поиск - в яндексе тоже попробуй. Например, trendnet выкладывает свои тулчейны, у тебя может быть тот же тулчейн, что и у них. Качаешь (обычно это тарбол с бинарниками, нахрен забывший про GPL).
Можно ещё GPL-запрос производителю сделает - а вдруг отправят исходники.

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

Уже интереснее

>./transocks_ev
./transocks_ev: can't load library 'libevent-2.1.so.7'
>LD_LIBRARY_PATH=/dev/shm/var/tmp/usb/usb1_1 ./transocks_ev
./transocks_ev: can't load library 'libc.so.6'

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

А у тебя есть инклуды хотя бы к системному libc для начала?

На устройстве похоже нет такого

#ONT/system/shell>ls usr
bin    lib    sbin   share
#ONT/system/shell>ls include
iwlib.h     wireless.h
#ONT/system/shell>

Если у тебя есть usb - можешь хоть полноценную gentoo туда закидывать.

В чруте?

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

С какими аргументами?

iliyap, мне вот любопытно, а почему ciadpi работает? Он что собран с таким же тулчейном? Тут вообще не указан динамический линкер.

$ readelf -Wl ciadpi-mips 

Тип файла ELF — DYN (Совм. исп. объектный файл)
Entry point 0x2ec0
There are 8 program headers, starting at offset 52

Заголовки программы:
  Тип            Смещ.    Вирт.адр   Физ.адр    Рзм.фйл Рзм.пм  Флг Выравн
  ABIFLAGS       0x000138 0x00000138 0x00000138 0x00018 0x00018 R   0x8
  REGINFO        0x000150 0x00000150 0x00000150 0x00018 0x00018 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x2a244 0x2a244 R E 0x10000
  LOAD           0x02a244 0x0003a244 0x0003a244 0x00ccc 0x0155c RW  0x10000
  DYNAMIC        0x000168 0x00000168 0x00000168 0x00100 0x00100 R   0x4
  GNU_EH_FRAME   0x02a1b0 0x0002a1b0 0x0002a1b0 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  NULL           0x000000 0x00000000 0x00000000 0x00000 0x00000     0x4

 Соответствие раздел-сегмент:
  Сегмент Разделы...
   00     .MIPS.abiflags 
   01     .reginfo 
   02     .MIPS.abiflags .reginfo .dynamic .hash .dynsym .dynstr .rel.dyn .init .text .fini .rodata .eh_frame_hdr .eh_frame 
   03     .init_array .fini_array .data.rel.ro .data .rld_map .got .sdata .bss 
   04     .dynamic 
   05     .eh_frame_hdr 
   06     
   07

Интересно, его разработчик есть на ЛОРе?

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

Раз не указан динамический линкер, значит это статически собранный бинарник. Ему не нужны шареные библиотеки. Это можно проверить с помощью readelf -Wd <бинарник> |grep NEEDED. Например, на обычной x86_64 glibc системы там будет:

> readelf -Wd /bin/ls |grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcap.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

А у этого бинарника в NEEDED должно быть пусто.

Тип бинарника DYN просто означает, что он собран с флагом gcc -pie.

Ты тоже наверное можешь собрать статический бинарник. Для этого надо скомпилировать все единицы трансляции с флагом gcc -fPIC, а потом слинковать с флагами gcc -static -static-libgcc -static-libstdc++. Все используемые при линковке библиотеки должны быть также собраны с gcc -fPIC и в виде статических архивов .a.

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

А у этого бинарника в NEEDED должно быть пусто.

Да, там пусто.

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

Чушь, для static не нужен -fPIC, он нужен только для pie и shared

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