静态链接libstdc ++的动态符号

时间:2016-09-20 08:58:27

标签: c++ linux gcc linker

我需要为32位平台编译我的c ++应用程序。为了支持旧系统,我已经静态链接了libstdc ++。麻烦的是,即使使用静态libstdc ++ gcc链接器也会添加很多动态符号。

以下是已编译应用程序的nm -D输出:

08137f2c u _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE
08137fbc u _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE
08135b24 V _ZTINSt8ios_base7failureE
08135930 V _ZTISt10bad_typeid
08134e90 V _ZTISt10moneypunctIcLb0EE
08134e70 V _ZTISt10moneypunctIcLb1EE
081354b0 V _ZTISt10moneypunctIwLb0EE
08135490 V _ZTISt10moneypunctIwLb1EE
08135b44 V _ZTISt11logic_error
08135b8c V _ZTISt11range_error
0813380c V _ZTISt11regex_error

还有很多其他的符号。它们大多是独特的全球或弱物。下面是Makefile和一个简单的cpp文件。

的main.cpp

#include <iostream>

int main()
{
  std::cout << "s" << std::endl;
  return 0;
}

生成文件

CXX         = g++
EXE         = app
CXXFLAGS    = -std=c++14 -m32
LDFLAGS     = -m32
LDLIBS      = -static-libstdc++ -static-libgcc

SOURCES     = main.cpp
OBJS        = $(subst .cpp,.o,$(SOURCES))

all: $(EXE)
    strip $(EXE)

$(EXE): $(OBJS)
    $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $<

clean:
    rm -rf $(OBJS) $(EXE)

有什么方法可以摆脱这些符号吗? 我使用的libstdc ++来自Arch linux上的最后一个gcc(6.2.1)。 x64版本编译时没有任何其他符号。

0 个答案:

没有答案