2011-02-14 3 views
7

Я скомпилировал библиотеку C++ под Linux/Mac с скрытыми символами. Я использовал _ атрибут _ ((видимость («скрытый»))) для всех моих классов и скомпилирован с параметрами (-c -O2 -fPIC -MMD -MP -MF). В Mac, используя MacDependencies (http://code.google.com/p/macdependency/), работа выполняется отлично, поскольку я вижу только мой экспорт (я действительно видел разницу до и после).Обозначение символа с помощью g ++

Тем не менее, я заметил, что использование nm Я все еще вижу все имена символов. Это происходит как в Mac, так и в Linux.

Почему? Есть ли способ избежать этого?

С наилучшими пожеланиями и спасибо, Джо

+0

В Linux вы используете 'nm -D' для отображения таблицы динамических символов? Видимость применима только к таблице динамических символов. – mark4o

+0

nm -D дает мне действительно правильный «список», спасибо. – JoeSlav

ответ

12

Public или скрытые символы все еще там. nm показаны все символы. Разница в том, что скрытые символы недоступны для динамического компоновщика, то есть не экспортируются и не могут быть вставлены.

Вам также могут понравиться следующие man gcc:

-fvisibility=default|internal|hidden|protected 
     ... 
     A good explanation of the benefits offered by ensuring ELF symbols 
     have the correct visibility is given by "How To Write Shared 
     Libraries" by Ulrich Drepper (which can be found at 
     <http://people.redhat.com/~drepper/>)---however a superior solution 
     made possible by this option to marking things hidden when the 
     default is public is to make the default hidden and mark things 
     public. This is the norm with DLL's on Windows and with 
     -fvisibility=hidden and "__attribute__ ((visibility("default")))" 
     instead of "__declspec(dllexport)" you get almost identical 
     semantics with identical syntax. This is a great boon to those 
     working with cross-platform projects. 
+2

Спасибо, Максим, определенно получил разницу. Возникает еще один вопрос: как я могу увидеть таблицу таких символов под Windows? Еще раз спасибо. – JoeSlav

+0

Возможно, 'зависит .exe' или' nm' от cygwin. –

+0

Еще раз спасибо, я попробую завтра. Вы знаете какой-либо способ фактически удалить эти символы из вывода nm? – JoeSlav

6

Вы можете strip бинарный файл, чтобы удалить все ненужные символы.

+1

Спасибо! Я на самом деле пытался отметить «Strip» из Netbeans, но это не помогло. Я попробовал теперь вручную --strip-all, и похоже, что я получил результат, которого ожидал. Спасибо всем, кто занимается сексом! – JoeSlav

0

В OSX (не уверен о других) я нашел следующее.

Как упоминалось Максимом, использование -fvisibility=hidden или __attribute__((visibility("hidden"))) все еще помещает символ в таблицу символов, оно просто помечено как неэкспортированное. Самый простой способ увидеть это с nm, например:

$ nm libfoo.dylib 
... 
0000000000001fa0 t __Z10a_functionv 
0000000000002140 T __Z17a_public_functionv 
... 

Если письмо после адреса в нижнем регистре это означает, что он не экспортируется. Здесь a_function() скрыт, а a_public_function имеет видимость по умолчанию.

обирать неэкспортированные символы из таблицы символов можно использовать strip -x, который по странице человека:

-x Удалить все локальные символы (сохранение только глобальные символы).

$ strip -x libfoo.dylib 
$ nm libfoo.dylib 
... 
0000000000002140 T __Z17a_public_functionv 
... 

Я верю (но я не уверен на 100%), что использование hidden не только количества для изменения флага, и «» Восстановления скрытых символы не будут тривиальными.