![](/img/trans.png)
[英]If clang++ and g++ are ABI incompatible, what is used for shared libraries in binary?
[英]G++ and clang++ incompatibility with standard library when building shared libraries?
如果我的文件clang.cpp包含:
#include <map>
void myfunc() {
std::map<int, int> mymap;
const int x = 20;
myfoo[x] = 42;
}
和main.cpp包含:
void myfunc();
int main() { myfunc(); }
编译clang++ -g clang.cpp -shared -fPIC -o libclang.so -stdlib=libstdc++ -std=c++11
和clang++ -g main.cpp -L -Wl.,-rpath=. -lclang -lstdc++ -o a.out -stdlib=libstc++ -std=c++11
clang++ -g main.cpp -L -Wl.,-rpath=. -lclang -lstdc++ -o a.out -stdlib=libstc++ -std=c++11
可以正常运行。
但是,如果我添加gcc.cpp包含:
#include <tuple>
template std::pair<int const, int>::pair(std::piecewise_construct_t, std::tuple<int const&>, std::tuple<>);
然后使用g++ -g gcc.cp -shared -fPIC -o libgcc.so
将其编译为共享库,并将链接命令更改为clang++ -g main.cpp -L -Wl.,-rpath=. -lgcc -lclang -stdlib=libstdc++ -std=c++11 -o a.out
clang++ -g main.cpp -L -Wl.,-rpath=. -lgcc -lclang -stdlib=libstdc++ -std=c++11 -o a.out
,然后运行./a.out
将分段故障。
我不知道该怎么做,因为当使用相同的c ++标准库时,clang和gcc应该兼容ABI。 我的版本是ubuntu随附的clang的3.6.2,gcc的5.2.1。
给定
int f(std::tuple<const int &> t){
return std::get<0>(t);
}
lang声生成
f(std::tuple<int const&>): # @f(std::tuple<int const&>)
movl (%rdi), %eax
retq
当GCC产生时
f(std::tuple<int const&>):
movq (%rdi), %rax
movl (%rax), %eax
ret
换句话说,Clang期望元组本身通过寄存器传递,而GCC期望地址将在寄存器中传递(并且元组在堆栈上传递)。
混合搭配,您将获得“有趣”的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.