Есть ли способ отображать скрытые символы видимости с GNU binutils?

Я работаю над сценарием, чтобы сделать uClibc пригодным для использования в существующей программной цепочке gcc / binutils, ориентированной на glibc, и одна проблема, с которой я остаюсь, заключается в том, что pthread_cancel необходимо dlopen libgcc_s.so.1 . Версия, поставляемая с хостом gcc, связана с зависимостью от glibc, поэтому я вместо этого использую ld -u для того, чтобы вытащить нужные символы (и их зависимости) из libgcc_eh.a чтобы сделать замену libgcc_s.so.1 :

 gcc -specs uclibc.specs -Wl,-u,_Unwind_Resume -Wl,-u,__gcc_personality_v0 \ -Wl,-u,_Unwind_ForcedUnwind -Wl,-u,_Unwind_GetCFA -shared -o libgcc_s.so.1 

В принципе, я бы это сделал, но все символы в libgcc_eh.a имеют видимость, скрытую, поэтому в выходном .so файле все они становятся локальными и не добавляются в .dynsym символов .dynsym .

Я ищу способ использовать binutils (возможно, objcopy ? Или скрипт компоновщика?) В любом файле .so или в исходных файлах .o в libgcc_eh.a чтобы скрыть эти символы. Это возможно?

Я думаю, вы должны иметь возможность использовать --globalize-symbol -globalize в objcopy.

например

 $ nm /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a |  grep emutls_alloc

 00000000 t emutls_alloc
 $ objcopy --globalize-symbol = emutls_alloc /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a /tmp/libgcc_eh.a
 $ nm /tmp/libgcc_eh.a | grep emutls_alloc
 00000000 T emutls_alloc

Вы можете предоставить символ -globalize-symbol несколько раз для objcopy, но вам нужно будет прямо указать полное имя символа всех символов, которые вы хотите использовать для глобализации.

Хотя я не уверен, какой разрыв может произойти, превратив libgcc_eh.a в общий объект, поскольку libgcc_eh.a предположительно скомпилирован без -fpic / -fPIC. Оказывается, libgcc_eh.a скомпилирован как независимый от позиции код.