Общие процедуры 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
...