что делать с отсутствующим libgcc_s.a

перекрестная компиляция библиотеки с помощью buildroot с использованием псевдонима внешней цепочки инструментов code sourcery lite 2011, что приводит к

output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status

из-за явно отсутствующего libgcc_s.a

# find . -iname "libgcc*"        
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/plugin/libgcc
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc_eh.a

Есть ли способ обойти эту проблему, сохраняя статическую ссылку? Есть ли параметр CLFAGS или LDFLAGS, который статически связывает все, кроме libgcc_s?

Материалы, которые пробовали до сих пор (помимо чтения соответствующих частей справочных страниц ld и gcc):

CFLAGS="-static -static-libgcc"
CFLAGS="-static -shared-libgcc"
CFLAGS="-static -static-libgcc -Wl,-Bstatic"
CFLAGS="-static -shared-libgcc -Wl,-Bstatic"

После добавления -Wl,-lgcc_s,-Bstatic я получаю огромное количество неопределенных/неизвестных символов... (-Bshared не является допустимым параметром, говорит ld)

/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `_g_local_file_info_get':
glocalfileinfo.c:(.text+0x2d90): warning: Using 'getgrgid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalvfs.o): In function `g_local_vfs_parse_name':
glocalvfs.c:(.text+0x174): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libglib-2.0.a(libglib_2_0_la-gutils.o): In function `g_get_user_database_entry':
gutils.c:(.text+0x254): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0x24c): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0x25c): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0xa0): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0xe0): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-gnetworkaddress.o): In function `g_network_address_parse_sockaddr':
gnetworkaddress.c:(.text+0x1ac): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
<<<< SNIP >>>>
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libxml2.a(xmlschemastypes.o): In function `xmlSchemaGetCanonValue':
xmlschemastypes.c:(.text+0x7680): undefined reference to `trunc'
xmlschemastypes.c:(.text+0x76bc): undefined reference to `trunc'
xmlschemastypes.c:(.text+0x7710): undefined reference to `floor'
xmlschemastypes.c:(.text+0x7760): undefined reference to `floor'
collect2: ld returned 1 exit status

person drahnr    schedule 14.09.2013    source источник
comment
stackoverflow.com/questions/7811962 /   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 08.06.2015


Ответы (1)


Возможно, можно исключить использование libgcc_s.a с флагами, которые не позволяют gcc использовать внутренние встроенные функции (например, встроенную memcpy), но вам, вероятно, лучше всего найти и использовать его.

Похоже, эта опция должна запретить использование встроенных модулей -fno-builtin. Подробнее см. здесь: http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

Связывание с общим libgcc_s.so

Если libgcc_s.a отсутствует или желательно использовать общую libgcc_s с другим статическим исполняемым файлом, это должно сработать:

CFLAGS="-static -Wl,-Bdynamic,-lgcc_s,-Bstatic"
person ash    schedule 14.09.2013
comment
приведенный выше результат поиска libgcc_s в пути установки кросс-компилятора (да, он установлен в каталоге buildroot, который является текущим рабочим каталогом .), и поэтому кажется, что он просто не существует... - person drahnr; 14.09.2013
comment
хм, как-то это пропускает. Я бы попробовал gcc -v или strace, чтобы убедиться, что он пытается использовать этот конкретный путь. - person ash; 14.09.2013
comment
ах, внимательно посмотрите на вывод find - там нет libgccc_s.a, поэтому статическое связывание не сработает. Вы можете попробовать связать его динамически - я обновлю ответ, чтобы показать, как это сделать. - person ash; 14.09.2013
comment
Извините, не понял, libgcc_s.a просто не существует, как показано в результатах поиска. Есть много других libgcc.a libgcc_eh.a, но ни одного экземпляра libgcc.a. Я все равно проверил пути, и они, кажется, в полном порядке (обновленный вопрос) - person drahnr; 14.09.2013
comment
Обновление в ответе должно охватывать это. Плохо, что gcc_s.a отсутствует - если вам нужен действительно статический исполняемый файл, вам понадобится либо эта библиотека, либо использование -fno-builtin, чтобы исключить ее использование (если этого достаточно). - person ash; 14.09.2013
comment
Неоптимально - я приклеен к этой цепочке инструментов ... и -fno-builtin кажется неудачным / недостаточным, но в настоящее время у моего встроенного скрипта есть некоторые другие проблемы, от которых я должен избавиться в первую очередь - прокомментирую, как только он заработает /Я уверен, что не работает - person drahnr; 14.09.2013
comment
Я понимаю. Возможно, вы можете вернуться к источнику цепочки инструментов и попытаться получить оттуда libgcc_s.a. Возможно, можно взять его откуда-то еще и использовать, но это может привести к болезненным ошибкам. Можно перестать использовать libgcc_s.a, но это было давно. - person ash; 14.09.2013
comment
Я все еще новичок в кросс-компиляции, поэтому я бы не стал так сильно обжигать руки (см. также обновленный вопрос) - person drahnr; 14.09.2013
comment
Кроме того, -Bshared, похоже, не поддерживается, но это скорее значение по умолчанию, поэтому вместо этого я попробовал -static -Wl,-lgcc_s,-Bstatic, что должно дать то же самое - person drahnr; 14.09.2013
comment
Ах, похоже, это должно быть -Bdynamic не общим. - person ash; 15.09.2013
comment
выход не меняется с дополнительным -Bdynamic - person drahnr; 15.09.2013
comment
думаю, это связано с порядком включения библиотеки - в любом случае первоначальная проблема решена - person drahnr; 15.09.2013
comment
первый раз, когда библиотека загружается, ее размещение в командной строке определяет, как она включена. Если установлен статический, он должен быть статическим, если динамический, он может быть либо динамическим, либо статическим. Таким образом, -Bstatic -lx -Bdynamic -ly принимает x только как статический, а y как любой из них. Как правило, чтобы заставить одну библиотеку быть статической, мы делаем -Bstatic -lx -Bdynamic, чтобы ее можно было добавить с другими аргументами до и после, ничего не нарушая. - person ash; 15.09.2013