LINUX.ORG.RU

вопрос твой задел меня за душу.
держи идею.
в примере *.so либа делается из *.a.
функции необходимые бинарнику можно посмотреть командой nm --dynamic
(man nm)

[rokot ~] nm --dynamic /bin/bash |more
00000000080c5368 B BC
00000000080bfd6c D EOF_Reached
00000000080c5378 B PC
00000000080c8f60 B SB
00000000080c5384 B UP
00000000080c5294 A _DYNAMIC
00000000080c5054 A _GLOBAL_OFFSET_TABLE_
                 U _IO_getc
                 U _IO_putc
00000000080a8fa4 R _IO_stdin_used
00000000080c5344 A __bss_start
00000000080c537c B __ctype_b
...

надо отобрать только те из них, что идут с буквами B,U,V во
втором столбце (опять man nm). названия функции и переменных
в третьем столбце.

после этого эти функции надо через скрипт скормить линкеру.
скрипт выглядит так:

[rokot ~] cat ldscript | more
INCLUDE /usr/lib/ldscripts/elf_i386.xs
EXTERN(abort)
EXTERN(access)
EXTERN(alarm) 
EXTERN(__assert)
EXTERN(atexit)  
EXTERN(atoi)    
... (много EXTERN до самого конца)

-------------------------------------

а теперь пример - шелловый скрипт, который все это делает.
(написать можно на чем угодно). необходимые бинарники передаются
параметрами в командной строке. 
здесь собирается libc из пакета uClibc, посмотрев makefile,
в котором собирается твоя либа - можно выдрать необходимую тебе команду.
Отличается она от nakefile-овой только строчкой
--script=ldscript , где ldscript - файл со скриптом для линкера.

#!/bin/bash

# -- вытаскиваем список функций и сохраняем его в functions.list
rm functions.list
for b in $*
 do
  nm -D $b | sed 's/^.\{17\}//' | awk '$1 ~ /[BUV]/' |awk '{print $2}' >>functions.list
 done

# -- стряпаем ldscript
echo "INCLUDE /usr/lib/ldscripts/elf_i386.xs" >ldscript
sort -u functions.list | awk '{print "EXTERN(" $1 ")"}' >>ldscript

# -- собираем из *.a либ *.so
gcc -s -nostdlib -Wl,-warn-common -shared \
        -o libuClibc-0.9.15.so \
        -Wl,-soname,libc.so.0 -Wl,--script=ldscript \
        ../libc/libc.a ../libc/tmp/libgcc-need.a

SadStork
()

SadStork

Огромнейший сеньк.

LamerOk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.