Pointers 共享XDR例程和指向.rodata节的指针

Pointers 共享XDR例程和指向.rodata节的指针,pointers,segmentation-fault,xdr,Pointers,Segmentation Fault,Xdr,我使用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));

我使用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\u char()函数中生成的。我的问题是:

在第一种情况下,编译器在.rodata部分分配Hello字符串,而在第二种情况下,使用堆的一部分来记忆字符串。是否会因为xdr____字符签名明确要求

char*
而不是

const char*

如你所见?所以在这种情况下,xdr___char()函数会更改我的数据?

我相信它在接收数据而不是发送数据时会更改数据。您确定您的远程呼叫确实在使用带
XDR\u ENCODE
模式的XDR吗?

要将字符串传输到XDR,您应该使用
XDR\u string
而不是
XDR\u char
;为我们显示
rpcgen
..

*.x
文件,我认为是这样的,因为在调用相应的服务器端函数时,服务器应该打印一些信息。我知道,我知道,你是对的,但这只是一个例子。问题是我正在处理的字符串不是以NULL结尾的。我只是想了解分割错误的原因。很抱歉,我无法显示.x文件,这是我的论文,并且有一些法律限制:(您可以在Debian或Ubuntu系统上使用
libc
的可调试变量进行调试,安装
libc6 dbg
包并适当设置
LD_LIBRARY_路径
。您应该查看
libc
的XDR部分的源代码。