Общие процедуры XDR и указатель на раздел.rodata

Я использовал rpcgen для создания заглушки клиента и сервера для разрабатываемой программы. Таким образом, заглушки используют XDR для инкапсуляции данных и отправки их по сети. Когда я выполняю этот фрагмент кода, возникает ошибка сегментации:

char *str = "Hello!";
my_remote_call(str, strlen(str));

Вместо этого нет проблем, если я изменю это следующим образом:

char *str = "Hello!";
char *str2 = (char*) malloc(strlen(str));
memcpy(str2, str, strlen(str));
my_remote_call(str2, strlen(str2));

С помощью GDB я обнаружил, что ошибка сегментации генерируется в функции xdr_u_char(), вызываемой my_remote_call(). Мой вопрос:

в первом случае строка Hello распределяется компилятором в секции.rodata, а во втором - часть кучи используется для запоминания строки. Может быть сгенерирована ошибка сегментации, потому что подпись xdr_u_char требует явно

char*

и не

const char*

как вы можете увидеть здесь? Значит в данном случае означает, что функция xdr_u_char() меняет мои данные?

2 ответа

Я считаю, что данные меняются, когда они получают, а не отправляют. Вы уверены, что ваш удаленный вызов действительно использует XDR с XDR_ENCODE Режим?

Для передачи строки в XDR вы должны использовать xdr_string не xdr_u_char; покажи нам *.x файл для rpcgen...

Другие вопросы по тегам