Форум программистов, компьютерный форум CyberForum.ru

С под Linux

Войти
Регистрация
Восстановить пароль
 
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 183
#1

Как не линковать функцию? - C Linux

30.11.2016, 15:34. Просмотров 277. Ответов 7
Метки нет (Все метки)

Доброго времени суток .

Я построил простую программу и получил elf файл.

Открывал я его
Bash
1
readelf -a main.elf
получил отчет
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
******
Symbol table '.symtab' contains 67 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 08048154     0 SECTION LOCAL  DEFAULT    1 
     2: 08048168     0 SECTION LOCAL  DEFAULT    2 
     3: 08048188     0 SECTION LOCAL  DEFAULT    3 
     4: 080481ac     0 SECTION LOCAL  DEFAULT    4 
     5: 080481cc     0 SECTION LOCAL  DEFAULT    5 
     6: 0804821c     0 SECTION LOCAL  DEFAULT    6 
     7: 08048268     0 SECTION LOCAL  DEFAULT    7 
     8: 08048274     0 SECTION LOCAL  DEFAULT    8 
     9: 08048294     0 SECTION LOCAL  DEFAULT    9 
    10: 0804829c     0 SECTION LOCAL  DEFAULT   10 
    11: 080482b4     0 SECTION LOCAL  DEFAULT   11 
    12: 080482f0     0 SECTION LOCAL  DEFAULT   12 
    13: 08048330     0 SECTION LOCAL  DEFAULT   13 
    14: 080484cc     0 SECTION LOCAL  DEFAULT   14 
    15: 080484e8     0 SECTION LOCAL  DEFAULT   15 
    16: 080484f8     0 SECTION LOCAL  DEFAULT   16 
    17: 08048534     0 SECTION LOCAL  DEFAULT   17 
    18: 08049f14     0 SECTION LOCAL  DEFAULT   18 
    19: 08049f1c     0 SECTION LOCAL  DEFAULT   19 
    20: 08049f24     0 SECTION LOCAL  DEFAULT   20 
    21: 08049f28     0 SECTION LOCAL  DEFAULT   21 
    22: 08049ff0     0 SECTION LOCAL  DEFAULT   22 
    23: 08049ff4     0 SECTION LOCAL  DEFAULT   23 
    24: 0804a00c     0 SECTION LOCAL  DEFAULT   24 
    25: 0804a014     0 SECTION LOCAL  DEFAULT   25 
    26: 0804a01c     0 SECTION LOCAL  DEFAULT   26 
    27: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    28: 08049f14     0 OBJECT  LOCAL  DEFAULT   18 __CTOR_LIST__
    29: 08049f1c     0 OBJECT  LOCAL  DEFAULT   19 __DTOR_LIST__
    30: 08049f24     0 OBJECT  LOCAL  DEFAULT   20 __JCR_LIST__
    31: 08048360     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux
    32: 0804a014     1 OBJECT  LOCAL  DEFAULT   25 completed.6159
    33: 0804a018     4 OBJECT  LOCAL  DEFAULT   25 dtor_idx.6161
    34: 080483c0     0 FUNC    LOCAL  DEFAULT   13 frame_dummy
    35: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    36: 08049f18     0 OBJECT  LOCAL  DEFAULT   18 __CTOR_END__
    37: 08048614     0 OBJECT  LOCAL  DEFAULT   17 __FRAME_END__
    38: 08049f24     0 OBJECT  LOCAL  DEFAULT   20 __JCR_END__
    39: 080484a0     0 FUNC    LOCAL  DEFAULT   13 __do_global_ctors_aux
    40: 00000000     0 FILE    LOCAL  DEFAULT  ABS main.c
    41: 08049f14     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_end
    42: 08049f28     0 OBJECT  LOCAL  DEFAULT   21 _DYNAMIC
    43: 08049f14     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_start
    44: 08049ff4     0 OBJECT  LOCAL  DEFAULT   23 _GLOBAL_OFFSET_TABLE_
    45: 0804a046     0 SECTION LOCAL  DEFAULT   27 
    46: 08048490     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
    47: 08048492     0 FUNC    GLOBAL HIDDEN    13 __i686.get_pc_thunk.bx
    48: 0804a00c     0 NOTYPE  WEAK   DEFAULT   24 data_start
    49: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.0
    50: 0804a014     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    51: 080484cc     0 FUNC    GLOBAL DEFAULT   14 _fini
    52: 08049f20     0 OBJECT  GLOBAL HIDDEN    19 __DTOR_END__
    53: 0804a00c     0 NOTYPE  GLOBAL DEFAULT   24 __data_start
    54: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    55: 0804a010     0 OBJECT  GLOBAL HIDDEN    24 __dso_handle
    56: 080484ec     4 OBJECT  GLOBAL DEFAULT   15 _IO_stdin_used
    57: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    58: 08048420    97 FUNC    GLOBAL DEFAULT   13 __libc_csu_init
    59: 0804a01c     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    60: 08048330     0 FUNC    GLOBAL DEFAULT   13 _start
    61: 080484e8     4 OBJECT  GLOBAL DEFAULT   15 _fp_hw
    62: 0804a014     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    63: 080483ee    45 FUNC    GLOBAL DEFAULT   13 main
    64: 0804b248    10 FUNC    GLOBAL DEFAULT   13 f_all
    65: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    66: 080482b4     0 FUNC    GLOBAL DEFAULT   11 _init
******
многие функции, в этом файле, не подлинкованы.
Bash
1
2
57: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
65: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
Это библиотечные функции.
Я так понимаю они получат ссылку на реальный код при выполнении.

Подскажите, а возможно в программе объявить функцию так что бы она была UND?
те не определена.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2016, 15:34     Как не линковать функцию?
Посмотрите здесь:

Как передать в функцию потока несколько аргументов? C Linux
C Linux Как использовать функцию wait()?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Вованя
122 / 122 / 47
Регистрация: 20.02.2014
Сообщений: 432
30.11.2016, 16:36     Как не линковать функцию? #2
zuuuuk, это не сама функция не определена, а её индекс в секции, то есть он будет известен во время выполнения , когда либа загрузится в адресное пространство процесса. А сделать её таковой можно объявив её как extern и реализовать её в отдельной либе.
Evg
Эксперт CАвтор FAQ
17397 / 5635 / 352
Регистрация: 30.03.2009
Сообщений: 15,420
Записей в блоге: 26
30.11.2016, 21:59     Как не линковать функцию? #3
По readelf --symbols показывается только таблица символов. Строго говоря, полезно ещё смотреть выдачу по readelf --relocs, чтобы увидеть места использования этих символов

Цитата Сообщение от zuuuuk Посмотреть сообщение
Подскажите, а возможно в программе объявить функцию так что бы она была UND?
те не определена
Если вопрос заключается в том, чтобы сделать что-то аналогичное тому, что ты видишь в readelf --symbols, то нужно описать внешнюю функцию и написать её использование (вызов или взятие адреса). Но где-то эта функция должна быть определена, в противном случае не отработает линковка, если рассматривать симметричный вариант, то "где-то" должно быть в динамической библиотеке

Но в идеале бы услышать более внятную формулировку вопроса, чего конкретно ты хочешь
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 183
01.12.2016, 16:00  [ТС]     Как не линковать функцию? #4
Цитата Сообщение от Вованя Посмотреть сообщение
это не сама функция не определена, а её индекс в секции, то есть он будет известен во время выполнения
Эта функция будет подключена во время загрузки программы. Эта функция библиотечная.
я хочу понять механизм определения и подключения стандартных функций.
что я вижу при компиляции и выполнении.
1) компилятор самостоятельно подключает стандартные библиотеки
Bash
1
 
Evg
Эксперт CАвтор FAQ
17397 / 5635 / 352
Регистрация: 30.03.2009
Сообщений: 15,420
Записей в блоге: 26
01.12.2016, 16:11     Как не линковать функцию? #5
Цитата Сообщение от zuuuuk Посмотреть сообщение
я хочу понять механизм определения и подключения стандартных функций
На этапе линковки компилятор получает объектный файл от твоей программы и динамическую библиотеку. Он видит, что в твоей программе есть обращение к, например, printf'у, видит, что в динамической библиотеке есть реализация printf'а и настроит исполняемый файл на то, чтобы динамический загрузчик связал всё это на этапе загрузки
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 183
01.12.2016, 16:19  [ТС]     Как не линковать функцию? #6
Цитата Сообщение от Вованя Посмотреть сообщение
это не сама функция не определена, а её индекс в секции, то есть он будет известен во время выполнения
Эта функция будет подключена во время загрузки программы. Эта функция библиотечная.
я хочу понять механизм определения и подключения стандартных функций.
что я вижу при компиляции и выполнении.
1) компилятор самостоятельно подключает стандартные библиотеки
Bash
1
gcc main.c -o .main.elf
т.к. я явно их не указываю.
2) получаю elf файл в котором нет текстовой реализации стандартных функций.
но есть секция в которой они обозначены, что они есть и должны быть подключены.
вот.....
Bash
1
2
3
4
5
6
readelf -r main.elf
Relocation section '.rel.plt' at offset 0x29c contains 3 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0804a000  00000107 R_386_JUMP_SLOT   00000000   printf
0804a004  00000207 R_386_JUMP_SLOT   00000000   __gmon_start__
0804a008  00000307 R_386_JUMP_SLOT   00000000   __libc_start_main
и не указанны секции реализации..
Bash
1
 48: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.0
Я хочу понять, каким образом компилятор такое делает?
потому что если я подключаю свои функции, то он требует их реализацию.
а реализация функции printf не находиться в моем elf файле. она находиться в GLIBC_2.0

А возможно ли , что бы в место R_386_JUMP_SLOT 00000000 printf стояла моя функция?
и указать системе на мою библиотеку myGLIBC_xx
и как это можно сделать?
Evg
Эксперт CАвтор FAQ
17397 / 5635 / 352
Регистрация: 30.03.2009
Сообщений: 15,420
Записей в блоге: 26
01.12.2016, 16:22     Как не линковать функцию? #7
Цитата Сообщение от zuuuuk Посмотреть сообщение
Я хочу понять, каким образом компилятор такое делает?
В посте #5 я всё объяснил

Цитата Сообщение от zuuuuk Посмотреть сообщение
потому что если я подключаю свои функции, то он требует их реализацию.
а реализация функции printf не находиться в моем elf файле. она находиться в GLIBC_2.0
Цитата Сообщение от zuuuuk Посмотреть сообщение
А возможно ли , что бы в место R_386_JUMP_SLOT 00000000 printf стояла моя функция?
и указать системе на мою библиотеку myGLIBC_xx
и как это можно сделать?
В посте #3 я всё пояснил
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 183
02.12.2016, 16:36  [ТС]     Как не линковать функцию? #8
спасибо я разобрался.
программа при запуске начинает искать библиотеки в переменных
системы и может найти мою библиотеку.
Yandex
Объявления
02.12.2016, 16:36     Как не линковать функцию?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru