Общие подпрограммы XDR и указатель на раздел .rodata - PullRequest
0 голосов
/ 06 ноября 2011

Я использовал 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 ]

0 голосов
/ 06 ноября 2011

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

0 голосов
/ 06 ноября 2011

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

...