С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С под Linux

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

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

30.11.2016, 15:34. Просмотров 301. Ответов 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?
те не определена.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2016, 15:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как не линковать функцию? (C Linux):

OpenIL как линковать - OpenGL
Стоит КодБлокс и МинГВ. Проблема в том что не могу прилинковать OpenIL. *.lib он вообще не линкует. Пошаманил, получилось 3 *.а файла. Тычу...

Как линковать файлы на windows? - Assembler
Подскажите как слинковать два файла FKernel.asm и FNKernel.cpp на виндовс. Код файла FKernel.asm: call kernel_main Код файла...

Как запретить линковать библиотеку? - C++ Qt
Использую в проекте videoInput. Компилятор msvc2010. Когда собираю релиз всё работает. А когда дебаг то вот такая ошибка вылетает :-1:...

как линковать библиотеки mingw, cygwin с vs? - C++
как линковать библиотеки, собранные с помощью mingw, cygwin (.a) с vs?

GCC как часть библиотек линковать статически, а часть динамически? - C++
Просто пока лень Qt пересобирать, чтобы возыметь статик-либы. Нужно Qt линковать динамически, а boost, gmp, ... статически. Возможно ли...

qmake. Заставить GCC линковать статически - C++ Qt
Нужно слинковать библиотеку GMP статически. Такая вещь в .pro файле, естественно, предпочитает динамические либы: unix:LIBS +=...

7
Вованя
137 / 134 / 48
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
30.11.2016, 16:36 #2
zuuuuk, это не сама функция не определена, а её индекс в секции, то есть он будет известен во время выполнения , когда либа загрузится в адресное пространство процесса. А сделать её таковой можно объявив её как extern и реализовать её в отдельной либе.
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,827
Записей в блоге: 28
30.11.2016, 21:59 #3
По readelf --symbols показывается только таблица символов. Строго говоря, полезно ещё смотреть выдачу по readelf --relocs, чтобы увидеть места использования этих символов

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

Но в идеале бы услышать более внятную формулировку вопроса, чего конкретно ты хочешь
0
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 184
01.12.2016, 16:00  [ТС] #4
Цитата Сообщение от Вованя Посмотреть сообщение
это не сама функция не определена, а её индекс в секции, то есть он будет известен во время выполнения
Эта функция будет подключена во время загрузки программы. Эта функция библиотечная.
я хочу понять механизм определения и подключения стандартных функций.
что я вижу при компиляции и выполнении.
1) компилятор самостоятельно подключает стандартные библиотеки
Bash
1
 
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,827
Записей в блоге: 28
01.12.2016, 16:11 #5
Цитата Сообщение от zuuuuk Посмотреть сообщение
я хочу понять механизм определения и подключения стандартных функций
На этапе линковки компилятор получает объектный файл от твоей программы и динамическую библиотеку. Он видит, что в твоей программе есть обращение к, например, printf'у, видит, что в динамической библиотеке есть реализация printf'а и настроит исполняемый файл на то, чтобы динамический загрузчик связал всё это на этапе загрузки
0
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 184
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
и как это можно сделать?
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,827
Записей в блоге: 28
01.12.2016, 16:22 #7
Цитата Сообщение от zuuuuk Посмотреть сообщение
Я хочу понять, каким образом компилятор такое делает?
В посте #5 я всё объяснил

Цитата Сообщение от zuuuuk Посмотреть сообщение
потому что если я подключаю свои функции, то он требует их реализацию.
а реализация функции printf не находиться в моем elf файле. она находиться в GLIBC_2.0
Цитата Сообщение от zuuuuk Посмотреть сообщение
А возможно ли , что бы в место R_386_JUMP_SLOT 00000000 printf стояла моя функция?
и указать системе на мою библиотеку myGLIBC_xx
и как это можно сделать?
В посте #3 я всё пояснил
1
zuuuuk
2 / 2 / 0
Регистрация: 05.01.2010
Сообщений: 184
02.12.2016, 16:36  [ТС] #8
спасибо я разобрался.
программа при запуске начинает искать библиотеки в переменных
системы и может найти мою библиотеку.
0
02.12.2016, 16:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2016, 16:36
Привет! Вот еще темы с ответами:

Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию) - C++
помогите решить пожалуйста Задание 2. Бинарная операция Создать класс вещественных чисел (double).. Определить оператор +, как...

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

Как выдернуть функцию локализации приложения в отдельную функцию из имеющегося проекта - Visual Basic
Ребята, помогите, уже глаза болят. У меня имеется проект неизвестного мне автора, в котором он представляет параметры\форматы определенной...

Как превратить символьное выражение в функцию от n-ного количества переменных в функцию f=@ (x, y,. . . . ) - Matlab
Добрый день. Вопрос такой Как превратить символьное выражение в функцию от n-ного количества переменных в функцию f=@(x,y,....) *** ?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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