Сборка без атомарных операций

Compilation and installation questions and stories
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Сборка без атомарных операций

Post by Dmitry »

видимо какой-то кривой или кастрированный загрузчик динамических объектов
в принципе, если загрузчик адекватный, то никаких дополнительных манипуляций с -Wl,-rpath,/usr/lib/accel-ppp делать не нужно
можно попробовать LD_LIBRARY_PATH=/usr/lib/accel-ppp/
если и это не поможет, то скопировать libtriton.so в /lib или /usr/lib или сделать ссылку
xander
Posts: 9
Joined: 05 Oct 2015, 14:36

Re: Сборка без атомарных операций

Post by xander »

Да он и с манипуляциями не работал. Видимо, действительно, такой загрузчик, потому что помогла символьная ссылка в /usr/lib, хотя, повторюсь, в accel-pppd при сборке runtime path был установлен корректно на "/usr/lib/accel-ppp".
xander
Posts: 9
Joined: 05 Oct 2015, 14:36

Re: Сборка без атомарных операций

Post by xander »

Возникла проблема в работе accel-ppp на устройствах. Предположительно из-за того, что на них используется порядок данных Big Endian.
Сама суть проблемы: через пару секунд после запуска accel-pppd завершается по out of memory. Логи пустые. Опытным путем обнаружили, что причина в accel-pppd/extra/ippool.c:

Code: Select all

167:		for (i = startip; i <= endip; i++) {
168:		ip = malloc(sizeof(*ip));
169:		ip->addr = htonl(i);
170:		list_add_tail(&ip->entry, list);
171:		cnt++;
172:	}
А именно в условиях цикла. Чуть выше:

Code: Select all

149:	*begin = ntohl((f4 << 24) | (f3 << 16) | (f2 << 8) | f1);
150:	*end = ntohl((m << 24) | (f3 << 16) | (f2 << 8) | f1);
То есть, ip-адреса преобразуются в прямой порядок и используются как границы цикла. В случае с Little Endian (x86, например) все отрабатывает должным образом, но при Big Endian порядке байт (include/netinet/in.h):

Code: Select all

# if __BYTE_ORDER == __BIG_ENDIAN
/* The host byte order is the same as network byte order,
   so these functions are all just identity.  */
# define ntohl(x)	(x)
# define ntohs(x)	(x)
# define htonl(x)	(x)
# define htons(x)	(x)
Таким образом, ip-адреса не преобразовываются и остаются в обратном порядке (наш дебаг с выводом startip и endip):

Code: Select all

add_range: startip=1677830336, endip=2013374656
Цикл бежит много миллионов раз и вызывает out of memory.
Не могу сказать, вызывает ли Big Endian проблемы где-то еще или только здесь, но в любом случае, на устройствах с таким порядком байт программа неработоспособна. Стоит ли ожидать патча или самим пробовать решить проблему?
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Сборка без атомарных операций

Post by Dmitry »

скопировать libtriton.so в /usr/lib или сделать ссылку
xander
Posts: 9
Joined: 05 Oct 2015, 14:36

Re: Сборка без атомарных операций

Post by xander »

Так libtriton подгружается, проблема именно в алгоритме. Загружаются все модули, кроме ippool, при загрузке которого возникает креш по вышеуказанным причинам.
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Сборка без атомарных операций

Post by Dmitry »

попробуй приложенный патч
Attachments
ippool.patch.gz
(493 Bytes) Downloaded 108 times
Post Reply