Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建a.so也是一个可执行的C++; 基于我尝试用C++复制,并且在主程序执行中得到分割错误。 /* pie.cpp */ #include <cstdio> int foo() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return 42; } int main() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return foo(); } /* pie.h */ #ifndef PIE_H #define PIE_H int foo(); #endif /* main.cpp */ #include <cstdio> #include <string> #include "pie.h" std::string data; int main() { data="TEST"; printf("in %s %s:%d [%s]\n", __func__, __FILE__, __LINE__, data.c_str()); return foo(); } $ g++ -fPIC -pie -o pie.so pie.cpp -Wl,-E $ g++ main.cpp ./pie.so $ ./pie.so in main pie.cpp:10 in foo pie.cpp:5 $ ./a.out Segmentation fault (core dumped) $ /*pie.cpp*/ #包括 int foo() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回42; } int main() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回foo(); } /*馅饼*/ #ifndef PIE_H #定义饼图 int foo(); #恩迪夫 /*main.cpp*/ #包括 #包括 #包括“pie.h” std::字符串数据; int main() { data=“TEST”; printf(“在%s%s中:%d[%s]\n”,\uuuu func\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu; 返回foo(); } $g++-fPIC-pie-o pie.so pie.cpp-Wl,-E $g++main.cpp./pie.so 美元/馅饼 在主馅饼中。cpp:10 在福派中,cpp:5 美元/年 分段故障(堆芯转储) $_C++_Linux_Shared Libraries_Glibc_Dlopen - Fatal编程技术网

构建a.so也是一个可执行的C++; 基于我尝试用C++复制,并且在主程序执行中得到分割错误。 /* pie.cpp */ #include <cstdio> int foo() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return 42; } int main() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return foo(); } /* pie.h */ #ifndef PIE_H #define PIE_H int foo(); #endif /* main.cpp */ #include <cstdio> #include <string> #include "pie.h" std::string data; int main() { data="TEST"; printf("in %s %s:%d [%s]\n", __func__, __FILE__, __LINE__, data.c_str()); return foo(); } $ g++ -fPIC -pie -o pie.so pie.cpp -Wl,-E $ g++ main.cpp ./pie.so $ ./pie.so in main pie.cpp:10 in foo pie.cpp:5 $ ./a.out Segmentation fault (core dumped) $ /*pie.cpp*/ #包括 int foo() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回42; } int main() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回foo(); } /*馅饼*/ #ifndef PIE_H #定义饼图 int foo(); #恩迪夫 /*main.cpp*/ #包括 #包括 #包括“pie.h” std::字符串数据; int main() { data=“TEST”; printf(“在%s%s中:%d[%s]\n”,\uuuu func\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu; 返回foo(); } $g++-fPIC-pie-o pie.so pie.cpp-Wl,-E $g++main.cpp./pie.so 美元/馅饼 在主馅饼中。cpp:10 在福派中,cpp:5 美元/年 分段故障(堆芯转储) $

构建a.so也是一个可执行的C++; 基于我尝试用C++复制,并且在主程序执行中得到分割错误。 /* pie.cpp */ #include <cstdio> int foo() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return 42; } int main() { printf("in %s %s:%d\n", __func__, __FILE__, __LINE__); return foo(); } /* pie.h */ #ifndef PIE_H #define PIE_H int foo(); #endif /* main.cpp */ #include <cstdio> #include <string> #include "pie.h" std::string data; int main() { data="TEST"; printf("in %s %s:%d [%s]\n", __func__, __FILE__, __LINE__, data.c_str()); return foo(); } $ g++ -fPIC -pie -o pie.so pie.cpp -Wl,-E $ g++ main.cpp ./pie.so $ ./pie.so in main pie.cpp:10 in foo pie.cpp:5 $ ./a.out Segmentation fault (core dumped) $ /*pie.cpp*/ #包括 int foo() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回42; } int main() { printf(“在%s%s中:%d\n”,函数,文件,行); 返回foo(); } /*馅饼*/ #ifndef PIE_H #定义饼图 int foo(); #恩迪夫 /*main.cpp*/ #包括 #包括 #包括“pie.h” std::字符串数据; int main() { data=“TEST”; printf(“在%s%s中:%d[%s]\n”,\uuuu func\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu; 返回foo(); } $g++-fPIC-pie-o pie.so pie.cpp-Wl,-E $g++main.cpp./pie.so 美元/馅饼 在主馅饼中。cpp:10 在福派中,cpp:5 美元/年 分段故障(堆芯转储) $,c++,linux,shared-libraries,glibc,dlopen,C++,Linux,Shared Libraries,Glibc,Dlopen,I“数据”的定义从全局移动到它运行的本地。 全局变量似乎没有被初始化 有人能解释一下发生了什么,应该做些什么来让它运行吗 代码文件结果上的gdb回溯: Program terminated with signal SIGSEGV, Segmentation fault. #0 std::string::size (this=0x404080 <data>) at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x8

I“数据”的定义从全局移动到它运行的本地。 全局变量似乎没有被初始化

有人能解释一下发生了什么,应该做些什么来让它运行吗

代码文件结果上的gdb回溯:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  std::string::size (this=0x404080 <data>) at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:716
716       { return _M_rep()->_M_length; }
(gdb) bt
#0  std::string::size (this=0x404080 <data>) at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:716
#1  std::string::assign (this=0x404080 <data>, __s=0x402010 "TEST", __n=4) at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:262
#2  0x00000000004011c5 in main () at main.cpp:9
程序以信号SIGSEGV终止,分段故障。
#0 std::string::size(this=0x404080)at/usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:716
716{return{M_rep()->{M_length;}
(gdb)英国电信
#0 std::string::size(this=0x404080)at/usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:716
#1 std::string::assign(this=0x404080,_s=0x402010“TEST”,_n=4)at/usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:262
#main()中的2 0x00000000004011c5位于main.cpp:9

谢谢

我刚刚尝试了我以前的代码;它不再使用最新的GLIBC(我有
2.31-9+build1
):

使用您的
C++
示例,我无法使用您的命令构建它:

$ g++ -fPIC -pie -o pie.so pie.cc -Wl,-E
$ gcc main.cc ./pie.so
/usr/bin/ld: /tmp/ccaXra73.o: in function `main':
main.cc:(.text+0x13): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(char const*)'
/usr/bin/ld: main.cc:(.text+0x1f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const'
/usr/bin/ld: /tmp/ccaXra73.o: in function `__static_initialization_and_destruction_0(int, int)':
main.cc:(.text+0x77): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()'
/usr/bin/ld: main.cc:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: error: ld returned 1 exit status

因此,我猜答案是:它本来不打算以这种方式工作(过去是“偶然”工作的),现在GLIBC检测并拒绝它。

全局未初始化变量存储在.bss部分。若在本地定义,则变量存储在堆栈中。这就是区别。构建一个调试版本并在调试器中运行它,以查看问题所在。我建议将
data.cİu str()
的结果分配给一个变量,并将该变量用于
printf
,以便于检查值。谢谢Emreİriş。我知道,但问题是为什么在这种情况下会出错?@Bado,我添加了回溯核心文件的gdb结果以供参考。就我所见,它在string上有缺陷,但为什么呢?glibc开发人员几年前决定,
。因此,不再支持带有入口点的
s。我没有写这篇文章作为回答,因为很明显我把我的书签放错了邮件列表讨论的地方。谢谢@Employed俄语。编译main时应该说是g++。我改正了样品。我遇到了一个分割错误,但我使用的是Glib2.17。因此,我认为较新版本检测到这一点,现在拒绝它,而不是Seg故障。glibc 2.30似乎在不允许加载饼图对象上添加了一个检查(第1204行用于检查,第1218行用于消息)。
$ g++ -fPIC -pie -o pie.so pie.cc -Wl,-E
$ gcc main.cc ./pie.so
/usr/bin/ld: /tmp/ccaXra73.o: in function `main':
main.cc:(.text+0x13): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(char const*)'
/usr/bin/ld: main.cc:(.text+0x1f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const'
/usr/bin/ld: /tmp/ccaXra73.o: in function `__static_initialization_and_destruction_0(int, int)':
main.cc:(.text+0x77): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()'
/usr/bin/ld: main.cc:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: error: ld returned 1 exit status
$ g++ main.cc ./pie.so

$ ./pie.so
in main pie.cc:9
in foo pie.cc:4

$ ./a.out
./a.out: error while loading shared libraries: ./pie.so: cannot dynamically load position-independent executable