LINUX.ORG.RU

Сообщения zloy_starper

 

Какие-то прямо чудеса при сборке библиотеки. Как найти ошибку.

Заранее извиняюсь за сумбур. Очень странная проблема.

Есть библиотека виджетов для Motif/X11. Собирается с помощью autotools. В составе пакета сами исходники библиотеки и примеры/тесты. Все собиралось и работало. Некоторое время назад переделал в библиотеке кое-что и добавил новый виджет. Соответственно добавил 3 теста/примера. Один из тестов вываливается с ошибкой.

Ошибка представляет собой сообщение о том, что неверно указано окно, для которого запрошено изменение каких-то параметров. Аналогичные ошибки я встречал неоднократно, когда при сборке приложения для Motif/Xt/X11 библиотеки указываются в некорректном порядке. Но у меня при сборке тестов в этом смысле все правильно. Это стало склонять меня к подозрению, что что-то не так с линковкой. К тому же другие тесты работали.

Поставил обработчик ошибки. Увидел, что после 3 ошибок выскакивает сообщение, что не определен код метода realise, и идет завершение. Два теста из трех работают. Все используют один и тот же виджет. И в тестах отличий по минимуму. Достаточно в неработающий тест добавить при создании виджета определение ресурса, например, изменить размер рамки, и тест отрабатывает.

Поэкспериментировал со старыми тестами. Добился, что один тест тоже стал вываливаться с аналогичной ошибкой, если в нем сократить все действия до минимума. То есть создаем виджет в топлевеле и ничего более. Хотя все это может не означать какой-либо закономерности. Просто какое-то стечение непонятных условий. Все это приводит меня в полное замешательство.

Тогда я взял и написал для сборки всего этого простой makefile. С ним все собирается и работает. Кинул собранную библиотеку в проект с autotools. Пересобрал тесты. Все тесты работают.

Что делать непонятно. Даже не знаю, что еще проверить, или поковырять. Что посоветуете?

 , ,

zloy_starper
()

А можно ли читать один и тот же сокет из разных потоков?

Что будет, если из разных потоков для одного дескриптора вызывать poll и recvfrom?

 

zloy_starper
()

Какие еще бывают способы предотвращения атак?

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

 

zloy_starper
()

Посоветуйте программу, отображающую различия в бинарных файлах

Обычная утилитка cmp не подходит. Нужно, чтобы отличия отображались, здесь такой блок данных, здесь другой блок данных.

 ,

zloy_starper
()

Почему не читаются пакеты из raw socket?

Вот простой пример программы чтения из raw socket. Ищется в инете чуть-ли самый первый.

/*** IPPROTO_RAW receiver ***/
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
	int s;
	struct sockaddr_in saddr;
	char packet[50];

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
		perror("error:");
		exit(EXIT_FAILURE);
	}

	memset(packet, 0, sizeof(packet));
	socklen_t *len = (socklen_t *)sizeof(saddr);
	int fromlen = sizeof(saddr);

	while(1) {
		if (recvfrom(s, (char *)&packet, sizeof(packet), 0,
			(struct sockaddr *)&saddr, &fromlen) < 0)
			perror("packet receive error:");

		int i = sizeof(struct iphdr);	/* print the payload */
		while (i < sizeof(packet)) {
			fprintf(stderr, "%c", packet[i]);
			i++;
		}
		printf("\n");
	}
	exit(EXIT_SUCCESS);
}



Работает, но только когда пакеты посылаются на петлевой интерфейс (127.0.0.1). А если послать их по реальной физичской сети, то программка ничего не читает из сокета. В чем может быть дело? tcpdump пакеты ловит, проверено, т.е. физически они передаются.

 ,

zloy_starper
()

Как в shell-скрипте получить в переменную числовое значение из hex-строки

Есть строки с шестнадцатиричными числами. Допустим, я читаю их с помощью read в цикле в переменную. Никак не могу сообразить, что нужно сделать, чтобы значение, записываемое в переменную воспринималось, как число, и со значением переменной можно было бы выполнять арифметические действия.

 

zloy_starper
()

А существуют ли программы-навигаторы именно для Linux, а не Android?

Программы, которые могут прокладывать маршрут, отслеживать движение и пр.

 ,

zloy_starper
()

А есть ли в UNICODE символ конечного поля?

Имеется в виду поле GF(q) или иначе это выглядит как символ F, у которого вертикальная линия двойная.

 

zloy_starper
()

Почему autoconf/automake не находит библиотеку?

Столкнулся со странной проблемой. Понадобилось скомпилировать программку. Она достаточно давно написана и сборочные скрипты давно не менялись. Для работы требует библиотеки, которую, соответственно, нужно тоже собрать и установить. Сборка и того и другого реализуется с помощью autoconf/automake. До сих пор все это работало без проблем. Теперь понадобилось это поставить под ARM64. Сборка библиотеки проходит успешно. А при сборке программы configure не находит библиотеку. Библиотека на месте. nm показывает, что функция, указанная в AC_CHECK_LIB присутствует. Не знаю, имеет ли значение тип архитектуры, но днем ранее нормально собирал все это на intel-е. autoconf 2.69 automake 1.16.1 gcc 8.4.1. На arm-е autoconf 2.6.9 automake 1.16.2 gcc 9.3.1.

 , ,

zloy_starper
()

Как на железе с не x86-ой архитектурой грузятся модули ядра?

Понятно, что ядро анализирует dtb-файл, строит структуру устройств. Что дальше? Как устанавливается связь между конкретным модулем с некоторым именем в соответствующем каталоге с конкретным устройством, описанном в dtb-файле?

 , ,

zloy_starper
()

Помогите понять, как выводится звук через HDMI

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

1. Посмотрел alsasmixer. На вкаладке HDMI-устройства никакого управления нет. Через HDMI-интерфейс гонится цифра. Логично. Управление громкостью может быть только на конечном устройстве, где уже воспроизводится аналоговый сигнал (например - телевизор). Однако, в разных программах есть регулировки уровня громкости, а может быть и еще много чего. Тогда получается, это делается через puls-у? Выходит, она в реальном времени перекодирует цифровой поток? 2. Насколько я понимаю, звуковое приложение может выводить цифровой аудио-поток в различных фформатах. А если вдруг окажется, что HDMI не поддерживает этот формат, то что происходит? Та же pulsa согласовыввает необходимый формат с каждым приложением?

3. А как вообще роутятся звуковые потоки? Это настраивается в ALSA? Или можно выбрать, куда выводить для конкретного приложения в puls-е? Или и там и там по разному?

 ,

zloy_starper
()

Что не так с export в скрипте?

Если мне не изменяет память, то чтобы значение переменной сохранялось за пределами скрипта после его исполнения, надо использовать команду export. Беру скрипт типа такого:

#!/bin/sh

export MUMUR="/home/mumur/bin"
export PATH=$PATH:$MURMUR

Исполняю его. После исполнения переменная MUMUR не существует, PATH остается та, что была до этого по умолчанию. Вроде они должны были бы сохраниться? Или я в чем-то тут туплю?

 

zloy_starper
()

poll и FIFO

Что-то никак не могу сообразить, как обработать событие POLLHUP, полученное от poll, когда отслеживается дескриптор FIFO на чтение. Стоит только записывающему процессу закрыть FIFO, как понятное дело возникает это событие. Последующие вызовы poll приводят сразу к немедленному возврату из него с установленным событием POLLHUP.

Получается единственный вариант: получил POLLHUP, закрыл fifo, снова открыл fifo, пошел на новую итерацию?

 ,

zloy_starper
()

А как ядро при страте монтирует rootfs?

Как то не приходилось задумываться на эту тему, а тут при очередном ковырянии с не intel железками стало интересно.

Положим в cmdline ядру при старте передается в том числе что-то типа rootfs=/dev/mmcblk0p1. Но до того, как смонтирована rootfs никакого /dev/mmcblk0p1 быть не может. Понятно, что /dev/mmcblk0p1 это лишь некая абстракция для доступа к устройству из userspace. Если драйвер вкомпилен в ядро, то он подцепляет устройство, и из ядра с ним можно работать. Но было бы интересно понять механизм монтирования rootfs самим ядром. Может там есть какие интересные нюансы.

 , ,

zloy_starper
()

Как определить текущие ip-адреса, назначенные сетевым интерфейсам?

Посоветуйте какой-нибудь простой, но желательно не костыльный способ. Думал, что где-нибудь в /proc что-то должно быть. Нашел таблицу маршрутизации. Но это не совсем то. Может плохо искал? Ну понятно, что через netlink можно. Но исходники iproute2 что-то тяжело ковыряются. Скажем, как получать через netlink события, связанные с изменением сетевых параметров понятно (мониторинг). Но не могу пока понять, как запросить текущее состояние.

 ,

zloy_starper
()

Какое внутреннее предствление символов лучше подходит для текстового редактора?

Как удобнее внутри некоего абстрактного текстового редактора хранить/обрабатывать текст - в виде мультибайтовых строк, или wchar_t? У кого какие на этот счет мысли. Может здесь кто-то «ковырял» исходники какого-нибудь существующего редактора.

Вроде на первый взгляд удобнее работать с широкими символами. Но может быть и оборотная сторона медали, которая с первого взгляда и не видна?

 ,

zloy_starper
()

Это Displayport/HDMI не дает поднять кадровую частоту, или ... ?

Запускаю игрульку на движке cube3d. Она показывает текущий fps. Значение прыгает в районе 60 кадров в секунду (59-60). Начинаю играться параметрами детализации и разрешения. И, о чудо, получаю все те же 59-60 кадров в секунду. При том, что разрешение хоть 4К, хоть FullHD, или и того меньше. Ну разве при каком-то разрешении типа 1200х780 (или типа того) частота поднялась до 75 кадров в секунду. Кстати Displayport 1.2, вроде как, тоже должен уметь 75 кадров в секунду для 4К.

Единственное, что приходит в голову, что современные драйвера в купе с современными видео интерфейсами понимают, что коль Displayport/HDMI все равно не дадут передать больше 60 кадров, то и стараться рендерить больше нет смысла.

Но Displayport 1.2 в FullHD должен позволить передавать 120 кадров в секунду, я уж не говорю про более дохлые видео режимы.

Получается это недоработки в драйвере (amdgpu)? Или это баги в мониторе? Или что?

 ,

zloy_starper
()

mips assembler - хочу уточнить логику.

Вроде бы как в нотации ATT $ перед операндом указывает на то, что надо использовать содержимое регистра, например: add $2, $9, $8 Т.е. содержимое регистра 8 сложили с содержимым регистра 9, результат поместили в регистр 2.

Без амперсанда указывается непосредственно операнд, типа: addiu $2, $9, 8 Т.е. 8 сложили с содержимым регистра 9, результат поместили в регистр 2.

Но с некоторыми командами сразу и не поймешь, что да как. Пример из доки:

unsigned mips_cycle_counter_read()
{
unsigned cc;
asm volatile("mfc0 %0, $9" : "=r" (cc));
return (cc << 1);
}

Получается, что $9 это указание читать из регистра номер 9 CP0? Т.е. я указываю не адрес/номер/смещение регистра из CP0, а именно его имя? Аналогично применяются команды mfc1, mfc2, rdhwr?

Просто, когда читаешь в доке, например, описание команды rdhwr, то складывается впечатление, что надо указывать номер загружаемого регистра. Я то и пробовал этот номер указывать либо непосредственно, либо через какой-нибудь регистр в ЦПУ. Таким макаром что-то не очень получалось.

 ,

zloy_starper
()

Какую видео карту выбрать с учетом использования open source драйверов?

Всегда отдавал предпочтение видюхам от Ati/AMD, так как они худо бедно, но открывают спеки и сами пишут OS-дрова. Так что целился на что-нибудь типа RX560. Но тут цены на них пеперли. Да и глянул я на старичков (уже не прошлые, а позопрошлые поколения) от Nvidia и обнаружил, что на свободных драйверах в 3д вполне себя хорошо чувствуют, а то и обгоняют AMD. При этом картинку показывают не хуже, никаких артефактов, как при начале пиления OS-дров не заметил. Так и задумался может лучше взять какой-нибудь GTX1050. Чуть дешевле, да может еще и чуть шустрее будет. Собственно вопрос то в чем: как живут нынче AMD RX560 и Nvidia GTX1050 с OS-дровами? На каких ядрах заводятся? Что могу, что не могут пока?

 , ,

zloy_starper
()

Помогите разобрать Makefile

Лет 10 уже не писал Makefile-ы, не могу понять, в чем собака порылась.

#!/usr/bin/make -f
CC := gcc

ifeq ($(CC),icc)
  CFLAGS += -qopenmp
endif

ifeq ($(CC),gcc)
  CFLAGS += -fopenmp
endif

CFLAGS += -I../include -lsrvc_cmd

TARGETS = $(patsubst %.c,%,$(wildcard *.c))

BINARY= $(patsubst %.c,%,$<)

install:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	@for bin in $(TARGETS); do (make $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

$(BINARY): $(BINARY)
	$(CC) $(CFLAGS) -o $@ $@.o

clean:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

cleanall:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

.PHONY: build clean clean all

Проблема в том, что в итоге прога не может быть слинкована с библиотекой srvc_cmd, не находится нужный символ. Полагаю, что причина в том, библиотека указывается до файла с текстом, типа:

gcc -fopenmp -I../include -lsrvc_cmd prog.c -o prog

 ,

zloy_starper
()

RSS подписка на новые темы