LINUX.ORG.RU

Как в шареной либе запретить експорт внутренних сиволов?


0

0

согласно man ld надо написать VERSION скрипт с именами експортируемых и локализуемых символов и передать его линкеру.

линкер скрипт нормально сьел но в конечном итоге ничего не изменилось

★★★★★

Ответ на: комментарий от ska

мне вот что отвечали: http://www.linux.org.ru/profile/dilmah/view-message.jsp?msgid=1720453

> esli C: static type fun_name() {...}

static работает только если вся библиотека в одном файле. Если библиотека в нескольких файлах, то неизбежно будут символы которые не нужно экспортировать из библиотеки, но которые нельзя объявлять static

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

а это пробовали?

$ man ld
.............
--exclude-symbols symbol,symbol,...
  Specifies a list of symbols which should not be automatically
  exported. The symbol names may be delimited by commas or colons.
  [This option is specific to the i386 PE  targeted  port  of the
  linker]
.............

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda


впрочем, да, PE specific...

ps: но можно ведь и слинковать в PE.. ;)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от dilmah


$ man ld
.......
--retain-symbols-file filename
Retain only the symbols listed in the file filename, discarding all others. filename is simply a flat file, with one symbol name per line. This option is especially useful in environments (such as VxWorks) where a large global symbol table is accumulated gradually, to conserve run-time memory.

--retain-symbols-file does not discard undefined symbols, or symbols needed for relocations.

You may only specify --retain-symbols-file once in the command line. It overrides -s and -S.
.......

причем что это судя по всему таки работает и static void foo(); честно удаляет из .symtab. правда, я не уверен, что полученная библиотека будет потом работать... ;)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

в сущности простой пример приведен ниже.

--- Makefile ---
CC=gcc
LD=ld
CFLAGS=-Wall -Werror -O2
LDFLAGS= -shared -pie --retain-symbols-file=foo.syms

all: libfoo.so

clean:
    rm -f *.so *.o

libfoo.so: foo.o util.o foo.syms Makefile
    $(LD) $(LDFLAGS) -o libfoo.so foo.o util.o
    readelf --all libfoo.so >libfoo.txt
    objdump -d -M intel libfoo.so >>libfoo.txt
--- Makefile ---

--- foo.c ---
extern int a(int x, int y);
extern int b(int x, int y);

int
foo(int x, int y)
{
    return a(x, y) + b(x, y);
}
--- foo.c ---

--- util.c ---
int
a(int x, int y)
{
    return x * y;
}

int
b(int x, int y)
{
    return x / y;
}
--- util.c ---

--- foo.syms ---
foo
--- foo.syms ---

собираем:

$ make
gcc -Wall -Werror -O2   -c -o foo.o foo.c
gcc -Wall -Werror -O2   -c -o util.o util.c
ld -shared -pie --retain-symbols-file=foo.syms -o libfoo.so foo.o util.o
readelf --all libfoo.so >libfoo.txt
objdump -d -M intel libfoo.so >>libfoo.txt

получаем на выходе желаемый результат:

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

--- libfoo.txt ---
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x1d8
  Start of program headers:          52 (bytes into file)
  Start of section headers:          852 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         14
  Section header string table index: 11

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        000000f4 0000f4 000013 00   A  0   0  1
  [ 2] .hash             HASH            00000108 000108 000034 04   A  3   0  4
  [ 3] .dynsym           DYNSYM          0000013c 00013c 000080 10   A  4   5  4
  [ 4] .dynstr           STRTAB          000001bc 0001bc 000019 00   A  0   0  1
  [ 5] .text             PROGBITS        000001d8 0001d8 000048 00  AX  0   0  4
  [ 6] .dynamic          DYNAMIC         00001220 000220 000060 08  WA  4   0  4
  [ 7] .got.plt          PROGBITS        00001280 000280 00000c 04  WA  0   0  4
  [ 8] .data             PROGBITS        0000128c 00028c 000000 00  WA  0   0  4
  [ 9] .bss              NOBITS          0000128c 00028c 000000 00  WA  0   0  4
  [10] .comment          PROGBITS        00000000 00028c 000062 00      0   0  1
  [11] .shstrtab         STRTAB          00000000 0002ee 000065 00      0   0  1
  [12] .symtab           SYMTAB          00000000 000584 0000f0 10     13  14  4
  [13] .strtab           STRTAB          00000000 000674 000005 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00000034 0x00000034 0x000c0 0x000c0 R E 0x4
  INTERP         0x0000f4 0x000000f4 0x000000f4 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /usr/lib/libc.so.1]
  LOAD           0x000000 0x00000000 0x00000000 0x00220 0x00220 R E 0x1000
  LOAD           0x000220 0x00001220 0x00001220 0x0006c 0x0006c RW  0x1000
  DYNAMIC        0x000220 0x00001220 0x00001220 0x00060 0x00060 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .hash .dynsym .dynstr .text 
   03     .dynamic .got.plt 
   04     .dynamic 
   05     

Dynamic section at offset 0x220 contains 7 entries:
  Tag        Type                         Name/Value
 0x00000004 (HASH)                       0x108
 0x00000005 (STRTAB)                     0x1bc
 0x00000006 (SYMTAB)                     0x13c
 0x0000000a (STRSZ)                      25 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000000 (NULL)                       0x0

There are no relocations in this file.

There are no unwind sections in this file.

Symbol table '.dynsym' contains 8 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000f4     0 SECTION LOCAL  DEFAULT    1 
     2: 000001d8     0 SECTION LOCAL  DEFAULT    5 
     3: 0000128c     0 SECTION LOCAL  DEFAULT    8 
     4: 0000128c     0 SECTION LOCAL  DEFAULT    9 
     5: 0000128c     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
     6: 0000128c     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
     7: 0000128c     0 NOTYPE  GLOBAL DEFAULT  ABS _end

Symbol table '.symtab' contains 15 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000f4     0 SECTION LOCAL  DEFAULT    1 
     2: 00000108     0 SECTION LOCAL  DEFAULT    2 
     3: 0000013c     0 SECTION LOCAL  DEFAULT    3 
     4: 000001bc     0 SECTION LOCAL  DEFAULT    4 
     5: 000001d8     0 SECTION LOCAL  DEFAULT    5 
     6: 00001220     0 SECTION LOCAL  DEFAULT    6 
     7: 00001280     0 SECTION LOCAL  DEFAULT    7 
     8: 0000128c     0 SECTION LOCAL  DEFAULT    8 
     9: 0000128c     0 SECTION LOCAL  DEFAULT    9 
    10: 00000000     0 SECTION LOCAL  DEFAULT   10 
    11: 00000000     0 SECTION LOCAL  DEFAULT   11 
    12: 00000000     0 SECTION LOCAL  DEFAULT   12 
    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
    14: 000001d8    45 FUNC    GLOBAL DEFAULT    5 foo

Histogram for bucket list length (total of 3 buckets):
 Length  Number     % of total  Coverage
      0  0          (  0.0%)
      1  3          (100.0%)    100.0%

No version information found in this file.

libfoo.so:     file format elf32-i386

Disassembly of section .text:

000001d8 <foo>:
 1d8:	55                   	push   ebp
 1d9:	89 e5                	mov    ebp,esp
 1db:	57                   	push   edi
 1dc:	56                   	push   esi
 1dd:	53                   	push   ebx
 1de:	83 ec 14             	sub    esp,0x14
 1e1:	8b 75 0c             	mov    esi,DWORD PTR [ebp+12]
 1e4:	8b 7d 08             	mov    edi,DWORD PTR [ebp+8]
 1e7:	56                   	push   esi
 1e8:	57                   	push   edi
 1e9:	e8 1a 00 00 00       	call   208 <foo+0x30>
 1ee:	89 c3                	mov    ebx,eax
 1f0:	58                   	pop    eax
 1f1:	5a                   	pop    edx
 1f2:	56                   	push   esi
 1f3:	57                   	push   edi
 1f4:	e8 1b 00 00 00       	call   214 <foo+0x3c>
 1f9:	01 c3                	add    ebx,eax
 1fb:	8d 65 f4             	lea    esp,[ebp-12]
 1fe:	89 d8                	mov    eax,ebx
 200:	5b                   	pop    ebx
 201:	5e                   	pop    esi
 202:	5f                   	pop    edi
 203:	c9                   	leave  
 204:	c3                   	ret    
 205:	90                   	nop    
 206:	90                   	nop    
 207:	90                   	nop    
 208:	55                   	push   ebp
 209:	89 e5                	mov    ebp,esp
 20b:	8b 45 0c             	mov    eax,DWORD PTR [ebp+12]
 20e:	0f af 45 08          	imul   eax,DWORD PTR [ebp+8]
 212:	c9                   	leave  
 213:	c3                   	ret    
 214:	55                   	push   ebp
 215:	89 e5                	mov    ebp,esp
 217:	8b 45 08             	mov    eax,DWORD PTR [ebp+8]
 21a:	99                   	cdq    
 21b:	f7 7d 0c             	idiv   DWORD PTR [ebp+12]
 21e:	c9                   	leave  
 21f:	c3                   	ret    
--- libfoo.txt ---

как видите, хотя a и b объявлены глобально тем не менее они не
экспортируются из конечной библиотеки.

// wbr

klalafuda ★☆☆
()

ИМХО лучше компилить с -fvisibility=hidden, а перед символами, которые должны быть видны снаружи ставить что-то типа MY_LIBRARY_EXPORT (макрос который будет эквивалентен "__attribute__ ((visibility ("default")))").

zim
()
Ответ на: комментарий от zim

> ИМХО лучше компилить с -fvisibility=hidden, а перед символами, которые должны быть видны снаружи ставить что-то типа MY_LIBRARY_EXPORT (макрос который будет эквивалентен "__attribute__ ((visibility ("default")))").

ну в общем да, то-же вариант. пожалуй, даже получше будет.

// wbr

klalafuda ★☆☆
()

1. то что мне нужно без проблем делает objcopy, но я всётаки хочу получить результат от линкера

2. насколько я понял retain удаляет ненужные символы вообще, что не есть то что мне нужно. мне нужно чтобы символ остался но никому не мешал. Типа сделать определённый нестатичный символ локальным после линковки

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> 2. насколько я понял retain удаляет ненужные символы вообще, что не есть то что мне нужно. мне нужно чтобы символ остался но никому не мешал. Типа сделать определённый нестатичный символ локальным после линковки

что-то я не совсем понял, что же именно хочется достичь в конечном итоге. само по себе желание перенести глобальные экспортируемые символы именно в локальные мне не понятно.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Хочется чтобы если шаренная либа и прога содержат по ф-и с одинаковым именем то каждый пользовал свою и эти ф-и не мешали друг другу.

и при этом сохранить отладочную инфу как в либе так и проге

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

кстати в соседнем треде интересную доку по теме предложили:

people.redhat.com/drepper/dsohowto.pdf

там описано зачем эт нужно, но немного для других целей

cvv ★★★★★
() автор топика
Ответ на: комментарий от klalafuda

мне кажется что под словом локальные следовало понимать hidden в терминах спецификации elf

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