Сокрытие инстанцированных шаблонов в общей библиотеке, созданной с g ++

У меня есть файл, который содержит следующее:

#include 

class A {};

void doSomething() {
   std::map m;
}

При компиляции в общую библиотеку с g ++ библиотека содержит динамические символы для всех методов std::map. С тех пор A является частным в этот файл, нет никакой возможности этого std::map будет инстанцирован в любой другой общей библиотеке с теми же параметрами, таким образом, я хотел бы сделать шаблонное инстанцирование скрытым (по некоторым причинам описанный в этом документе).

Я думал, что должен смочь сделать это путем добавления явного инстанцирования шаблонного класса и маркировки его, как скрытый, как так:

#include 

class A {};
template class __attribute__((visibility ("hidden"))) std::map;

void doSomething() {
   std::map m;
}

Однако это не имеет никакого эффекта: символы все еще все экспортируются. Я также пытался окружить весь файл:

#pragma GCC visibility push(hidden)
...
#pragma GCC visibility pop

но это также не имеет никакого эффекта на видимость методов std::map (хотя это действительно скрывается doSomething). Точно так же компиляция с -fvisibility=hidden не имеет никакого эффекта на видимость методов std::map.

Документ, который я связал с вышеупомянутым, описывает использование карт экспорта для ограничения видимости, но это кажется очень утомительным.

Существует ли способ сделать то, что я хочу в g ++ (кроме использования карт экспорта)? Если так, что это? В противном случае существует ли серьезное основание, почему эти символы должны всегда экспортироваться, или это - просто пропуск в g ++?

13
задан jchl 27 May 2010 в 10:40
поделиться

5 ответов

Из отчета об ошибке GCC # 36022 , который был помечен как НЕДЕЙСТВИТЕЛЬНЫЙ, Бенджамин Косник заметил:

[A] Класс исключения, который будет возникать между DSO, должен быть явно отмечены видимостью по умолчанию, так что узлы `type_info 'будут унифицированы между DSO. Таким образом, обоснование того, что libstdc ++ имеет пространство имен std, имеет видимость "default."

Кроме того, просматривая исходный код libstdc ++ для std :: map (мой находится в / usr / include / c ++ / 4.4.4 / bits / stl_map.h ]), похоже, что libstdc ++ обеспечивает видимость по умолчанию с помощью макроса _GLIBCXX_BEGIN_NESTED_NAMESPACE , который используется в верхней части stl_map.h :

# define _GLIBCXX_VISIBILITY_ATTR(V) __attribute__ ((__visibility__ (#V)))
# define _GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y) _GLIBCXX_BEGIN_NAMESPACE(X)
# define _GLIBCXX_BEGIN_NAMESPACE(X) namespace X _GLIBCXX_VISIBILITY_ATTR(default) {

Следовательно, ваша реализация STL явно переопределяет -fvisibility = hidden и #pragma GCC visibility push (hidden) / #pragma GCC visibility pop .

Если вы действительно хотите, чтобы члены std :: map имели скрытую видимость, то я думаю, вы могли бы использовать что-то вроде:

// ensure that default visibility is used with any class that is used as an exception type
#include <memory>
#include <new>
#include <stdexcept>

// now include the definition of `std::map` using hidden visibility
#include <bits/c++config.h>
#undef _GLIBCXX_VISIBILITY_ATTR
#define _GLIBCXX_VISIBILITY_ATTR(V) __attribute__ ((__visibility__ ("hidden")))
#include <map>
#undef _GLIBCXX_VISIBILITY_ATTR
#define _GLIBCXX_VISIBILITY_ATTR(V) __attribute__ ((__visibility__ (#V))) // restore `_GLIBCXX_VISIBILITY_ATTR`

Затем следующая серия команд будет проверять, что std :: map члены могут быть удалены из общего объекта:

  1. g ++ -c -fPIC -fvisibility = hidden test.cpp
  2. g ++ -shared -Wl, -soname, libtest .so.1 -o libtest.so.1.0 test.o
  3. strip -x libtest.so.1.0
  4. readelf -s libtest.so.1.0

Обратите внимание, что перед шагом 3, readelf - s libtest.so.1.0 напечатал (для меня):

Symbol table '.dynsym' contains 23 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     2: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND _ZdlPv@GLIBCXX_3.4 (2)
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND __gxx_personality_v0@CXXABI_1.3 (3)
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND _Unwind_Resume@GCC_3.0 (4)
     6: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.1.3 (5)
     7: 00000d02     5 FUNC    WEAK   DEFAULT   12 _ZNSt4pairIKi1AED1Ev
     8: 00000d6c    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEEC1ISt
     9: 00000d96    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    10: 000023bc     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    11: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    12: 00000d5e     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    13: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    14: 00000bac     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    15: 00000d08    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    16: 000007f4     0 FUNC    GLOBAL DEFAULT   10 _init
    17: 00000c4a    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    18: 00000df8     0 FUNC    GLOBAL DEFAULT   13 _fini
    19: 00000dba     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    20: 00000cde    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEED1Ev
    21: 00000d90     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    22: 00000ac6    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS

Symbol table '.symtab' contains 84 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000f4     0 SECTION LOCAL  DEFAULT    1 
     2: 00000118     0 SECTION LOCAL  DEFAULT    2 
     3: 000001c0     0 SECTION LOCAL  DEFAULT    3 
     4: 0000022c     0 SECTION LOCAL  DEFAULT    4 
     5: 0000039c     0 SECTION LOCAL  DEFAULT    5 
     6: 000006b6     0 SECTION LOCAL  DEFAULT    6 
     7: 000006e4     0 SECTION LOCAL  DEFAULT    7 
     8: 00000754     0 SECTION LOCAL  DEFAULT    8 
     9: 0000077c     0 SECTION LOCAL  DEFAULT    9 
    10: 000007f4     0 SECTION LOCAL  DEFAULT   10 
    11: 00000824     0 SECTION LOCAL  DEFAULT   11 
    12: 00000930     0 SECTION LOCAL  DEFAULT   12 
    13: 00000df8     0 SECTION LOCAL  DEFAULT   13 
    14: 00000e14     0 SECTION LOCAL  DEFAULT   14 
    15: 00000ef8     0 SECTION LOCAL  DEFAULT   15 
    16: 00001240     0 SECTION LOCAL  DEFAULT   16 
    17: 0000225c     0 SECTION LOCAL  DEFAULT   17 
    18: 00002264     0 SECTION LOCAL  DEFAULT   18 
    19: 0000226c     0 SECTION LOCAL  DEFAULT   19 
    20: 00002270     0 SECTION LOCAL  DEFAULT   20 
    21: 00002358     0 SECTION LOCAL  DEFAULT   21 
    22: 00002364     0 SECTION LOCAL  DEFAULT   22 
    23: 000023ac     0 SECTION LOCAL  DEFAULT   23 
    24: 000023b4     0 SECTION LOCAL  DEFAULT   24 
    25: 00000000     0 SECTION LOCAL  DEFAULT   25 
    26: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    27: 0000225c     0 OBJECT  LOCAL  DEFAULT   17 __CTOR_LIST__
    28: 00002264     0 OBJECT  LOCAL  DEFAULT   18 __DTOR_LIST__
    29: 0000226c     0 OBJECT  LOCAL  DEFAULT   19 __JCR_LIST__
    30: 00000930     0 FUNC    LOCAL  DEFAULT   12 __do_global_dtors_aux
    31: 000023b4     1 OBJECT  LOCAL  DEFAULT   24 completed.5942
    32: 000023b8     4 OBJECT  LOCAL  DEFAULT   24 dtor_idx.5944
    33: 000009b0     0 FUNC    LOCAL  DEFAULT   12 frame_dummy
    34: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    35: 00002260     0 OBJECT  LOCAL  DEFAULT   17 __CTOR_END__
    36: 0000123c     0 OBJECT  LOCAL  DEFAULT   15 __FRAME_END__
    37: 0000226c     0 OBJECT  LOCAL  DEFAULT   19 __JCR_END__
    38: 00000dc0     0 FUNC    LOCAL  DEFAULT   12 __do_global_ctors_aux
    39: 00000000     0 FILE    LOCAL  DEFAULT  ABS test.cpp
    40: 00000d64     8 FUNC    LOCAL  HIDDEN   12 _ZNKSt8_Rb_treeIiSt4pairI
    41: 000023b0     4 OBJECT  LOCAL  HIDDEN   23 DW.ref.__gxx_personality_
    42: 00000b40    11 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    43: 00000bc8   129 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    44: 00000bb1    11 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    45: 00000b4c    96 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    46: 00000ca0    62 FUNC    LOCAL  HIDDEN   12 _ZNKSt8_Rb_treeIiSt4pairI
    47: 00000ab2    19 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    48: 00002364     0 OBJECT  LOCAL  HIDDEN  ABS _GLOBAL_OFFSET_TABLE_
    49: 00000a56    92 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    50: 000009ec    30 FUNC    LOCAL  HIDDEN   12 _Z11doSomethingv
    51: 00000c6e    49 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    52: 00000a32    35 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    53: 000023ac     0 OBJECT  LOCAL  HIDDEN   23 __dso_handle
    54: 00000a0a    19 FUNC    LOCAL  HIDDEN   12 _ZNSt3mapIi1ASt4lessIiESa
    55: 00002268     0 OBJECT  LOCAL  HIDDEN   18 __DTOR_END__
    56: 00000bbc    11 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    57: 00000a1e    19 FUNC    LOCAL  HIDDEN   12 _ZNSt3mapIi1ASt4lessIiESa
    58: 00000d2c    50 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    59: 00000aea    85 FUNC    LOCAL  HIDDEN   12 _ZNSt8_Rb_treeIiSt4pairIK
    60: 000009e7     0 FUNC    LOCAL  HIDDEN   12 __i686.get_pc_thunk.bx
    61: 00002270     0 OBJECT  LOCAL  HIDDEN  ABS _DYNAMIC
    62: 00000d02     5 FUNC    WEAK   DEFAULT   12 _ZNSt4pairIKi1AED1Ev
    63: 00000c4a    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    64: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    65: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    66: 00000000     0 FUNC    GLOBAL DEFAULT  UND _ZdlPv@@GLIBCXX_3.4
    67: 00000df8     0 FUNC    GLOBAL DEFAULT   13 _fini
    68: 00000d6c    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEEC1ISt
    69: 00000dba     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    70: 00000cde    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEED1Ev
    71: 00000d5e     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    72: 00000d90     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    73: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    74: 00000d96    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    75: 00000bac     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    76: 000023bc     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    77: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    78: 00000ac6    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    79: 00000000     0 FUNC    GLOBAL DEFAULT  UND __gxx_personality_v0@@CXX
    80: 00000000     0 FUNC    GLOBAL DEFAULT  UND _Unwind_Resume@@GCC_3.0
    81: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@@GLIBC_2.1
    82: 00000d08    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    83: 000007f4     0 FUNC    GLOBAL DEFAULT   10 _init

И после:

Symbol table '.dynsym' contains 23 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     2: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND _ZdlPv@GLIBCXX_3.4 (2)
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND __gxx_personality_v0@CXXABI_1.3 (3)
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND _Unwind_Resume@GCC_3.0 (4)
     6: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.1.3 (5)
     7: 00000d02     5 FUNC    WEAK   DEFAULT   12 _ZNSt4pairIKi1AED1Ev
     8: 00000d6c    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEEC1ISt
     9: 00000d96    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    10: 000023bc     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    11: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    12: 00000d5e     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    13: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    14: 00000bac     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    15: 00000d08    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    16: 000007f4     0 FUNC    GLOBAL DEFAULT   10 _init
    17: 00000c4a    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    18: 00000df8     0 FUNC    GLOBAL DEFAULT   13 _fini
    19: 00000dba     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    20: 00000cde    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEED1Ev
    21: 00000d90     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    22: 00000ac6    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS

Symbol table '.symtab' contains 51 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000f4     0 SECTION LOCAL  DEFAULT    1 
     2: 00000118     0 SECTION LOCAL  DEFAULT    2 
     3: 000001c0     0 SECTION LOCAL  DEFAULT    3 
     4: 0000022c     0 SECTION LOCAL  DEFAULT    4 
     5: 0000039c     0 SECTION LOCAL  DEFAULT    5 
     6: 000006b6     0 SECTION LOCAL  DEFAULT    6 
     7: 000006e4     0 SECTION LOCAL  DEFAULT    7 
     8: 00000754     0 SECTION LOCAL  DEFAULT    8 
     9: 0000077c     0 SECTION LOCAL  DEFAULT    9 
    10: 000007f4     0 SECTION LOCAL  DEFAULT   10 
    11: 00000824     0 SECTION LOCAL  DEFAULT   11 
    12: 00000930     0 SECTION LOCAL  DEFAULT   12 
    13: 00000df8     0 SECTION LOCAL  DEFAULT   13 
    14: 00000e14     0 SECTION LOCAL  DEFAULT   14 
    15: 00000ef8     0 SECTION LOCAL  DEFAULT   15 
    16: 00001240     0 SECTION LOCAL  DEFAULT   16 
    17: 0000225c     0 SECTION LOCAL  DEFAULT   17 
    18: 00002264     0 SECTION LOCAL  DEFAULT   18 
    19: 0000226c     0 SECTION LOCAL  DEFAULT   19 
    20: 00002270     0 SECTION LOCAL  DEFAULT   20 
    21: 00002358     0 SECTION LOCAL  DEFAULT   21 
    22: 00002364     0 SECTION LOCAL  DEFAULT   22 
    23: 000023ac     0 SECTION LOCAL  DEFAULT   23 
    24: 000023b4     0 SECTION LOCAL  DEFAULT   24 
    25: 00000000     0 SECTION LOCAL  DEFAULT   25 
    26: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    27: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    28: 00000000     0 FILE    LOCAL  DEFAULT  ABS test.cpp
    29: 00000d02     5 FUNC    WEAK   DEFAULT   12 _ZNSt4pairIKi1AED1Ev
    30: 00000c4a    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    31: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    32: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    33: 00000000     0 FUNC    GLOBAL DEFAULT  UND _ZdlPv@@GLIBCXX_3.4
    34: 00000df8     0 FUNC    GLOBAL DEFAULT   13 _fini
    35: 00000d6c    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEEC1ISt
    36: 00000dba     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    37: 00000cde    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt4pairIKi1AEED1Ev
    38: 00000d5e     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    39: 00000d90     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    40: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    41: 00000d96    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    42: 00000bac     5 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    43: 000023bc     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    44: 000023b4     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    45: 00000ac6    35 FUNC    WEAK   DEFAULT   12 _ZNSaISt13_Rb_tree_nodeIS
    46: 00000000     0 FUNC    GLOBAL DEFAULT  UND __gxx_personality_v0@@CXX
    47: 00000000     0 FUNC    GLOBAL DEFAULT  UND _Unwind_Resume@@GCC_3.0
    48: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@@GLIBC_2.1
    49: 00000d08    35 FUNC    WEAK   DEFAULT   12 _ZN9__gnu_cxx13new_alloca
    50: 000007f4     0 FUNC    GLOBAL DEFAULT   10 _init

См. также:

12
ответ дан 2 December 2019 в 00:31
поделиться

Заявление об ограничении ответственности : я не разработчик GCC, и поэтому это полный WAG (безумное предположение):

Я предполагаю, что GCC всегда экспортирует определения шаблонов, чтобы позволить компоновщику удалить повторяющиеся копии шаблонов. Если бы он не был экспортирован и исходный файл использовал этот шаблон более одного раза, весь исходный код для класса std :: map был бы продублирован в двух файлах.

Думаю, вы действительно уделяете этому больше внимания, чем оно того заслуживает. Экспорт - это деталь реализации в C ++. В C имеет смысл не экспортировать внутренние функции, чтобы клиенты не полагались на них. Но в C ++ экспортируемые функции никогда не должны иметь ничего общего с исходным кодом. Одна версия GCC std :: map может полностью отличаться от других версий, и в результате два двоичных файла не будут совместимы по ссылкам.

Если вам абсолютно необходима переносимость, экспортируйте интерфейс C и игнорируйте экспортируемые особенности C ++. Любой клиент вашей библиотеки, пытающийся вызвать такие экспорты или сделать что-нибудь с ними, заслуживает того, чтобы вылететь из строя из-за вызова очевидных внутренних деталей реализации.

РЕДАКТИРОВАТЬ: Сделано CW, потому что я не на 100% уверен.

0
ответ дан 2 December 2019 в 00:31
поделиться

В C++, если аргумент шаблона имеет ограниченную видимость, это ограничение неявно распространяется на экземпляр шаблона.

#include <map>

class __attribute__((visibility ("hidden"))) A {};

void doSomething() {
  std::map<int, A> m;
}

должен выполнить эту работу.

-- править --
Еще одна вещь, «#pragma видимости GCC» влияет только на объявления области пространства имен. Классы и специализации шаблонов не затрагиваются (Visibility pragmas)

0
ответ дан 2 December 2019 в 00:31
поделиться

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36022: Пространство имен std::namespace должно быть раскрыто и помечено как таковое в заголовках libstdc++.

Что касается

#undef _GLIBCXX_VISIBILITY_ATTR

вот еще одна цитата:

Если бы вы взломали поддержку разрешения пространству имен std иметь скрытую видимость, и запустить тестовый набор с -fvisibility=hidden (см. прилагаемый патч), вы бы заметили провал в результатах тестирования, с массой неудач.

2
ответ дан 2 December 2019 в 00:31
поделиться

Может быть, вы могли бы использовать objcopy с опцией --strip-symbol?

Опция описана на странице objcopy man page

Это может оказаться утомительным, хотя...

0
ответ дан 2 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: