Есть ли способ показать символы скрытой видимости с помощью GNU binutils?

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

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


person R.. GitHub STOP HELPING ICE    schedule 30.04.2012    source источник


Ответы (2)



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

e.g.

$ 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 компилируется как код, независимый от позиции.

person nos    schedule 17.08.2012
comment
Предположительно, объектные файлы в libgcc_eh.a должны использоваться в общих библиотеках PIC или исполняемых файлах PIE, поскольку они загружаются в них, когда общий libgcc_s.so не используется, но я могу ошибаться. В любом случае будет работать как минимум на i386, где разрешены текстрелы. - person R.. GitHub STOP HELPING ICE; 17.08.2012
comment
Только что увидел вашу правку. Оставляю свой комментарий, потому что я думаю, что он объясняет, почему код скомпилирован как PIC. - person R.. GitHub STOP HELPING ICE; 17.08.2012
comment
К сожалению, --globalize-symbol изменяет только состояние GLOBAL/LOCAL. Насколько я вижу, objcopy не имеет возможности изменить состояние ПО УМОЛЧАНИЮ/СКРЫТОЕ. - person mhsmith; 12.02.2020