Как линкер линкует либы?
От: gybson  
Дата: 13.02.04 12:56
Оценка:
Зашел спор, в котором аргументов кроме как "Я так думаю" и "Вроде где-то видел" у меня нет. Суть: при линковке lib файлов к проекту, в код программы попадают только те функции, которые не вызываются в коде или вапще все из данного либника? Если внутри функции сродержащейся в либнике есть вызов другой функции из этой же библиотеки, то в либфайле содержится список функци от которых завивисит данная или опять же надо включать в код "на всякий случай" все?
Re: Как линкер линкует либы?
От: LaptevVV Россия  
Дата: 13.02.04 13:06
Оценка:
Здравствуйте, gybson, Вы писали:

G>Зашел спор, в котором аргументов кроме как "Я так думаю" и "Вроде где-то видел" у меня нет. Суть: при линковке lib файлов к проекту, в код программы попадают только те функции, которые не вызываются в коде или вапще все из данного либника? Если внутри функции сродержащейся в либнике есть вызов другой функции из этой же библиотеки, то в либфайле содержится список функци от которых завивисит данная или опять же надо включать в код "на всякий случай" все?

Только те, что вызываются. Ничего лишнего не включается. Легко проверить, посмотрев длину либов и длину своих ехешников. Возьми сначала "пустой" майн, а потом синус вызови и посмотри разницу. Если в либа включалась вся — длина была бы одинакова.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Как линкер линкует либы?
От: Bell Россия  
Дата: 13.02.04 13:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Только те, что вызываются. Ничего лишнего не включается. Легко проверить, посмотрев длину либов и длину своих ехешников. Возьми сначала "пустой" майн, а потом синус вызови и посмотри разницу. Если в либа включалась вся — длина была бы одинакова.


Строго говоря, это зависит от самого линкера. Не помню уже деталей (давненько это было), но не раз слышал, что какой-то борландовский линкер прилинковывал все целиком.
Но современные линкеры наверняка достаточно умны для того, чтобы линковать только то, что дейстмительно используется.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как линкер линкует либы?
От: LaptevVV Россия  
Дата: 13.02.04 13:47
Оценка:
Здравствуйте, Bell, Вы писали:

B>Строго говоря, это зависит от самого линкера. Не помню уже деталей (давненько это было), но не раз слышал, что какой-то борландовский линкер прилинковывал все целиком.

Это, наверное, было ОЧЕНЬ давно?
B>Но современные линкеры наверняка достаточно умны для того, чтобы линковать только то, что дейстмительно используется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Как линкер линкует либы?
От: Bell Россия  
Дата: 13.02.04 13:53
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Bell, Вы писали:


Нет, не очень
http://www.rsdn.ru/Forum/Message.aspx?mid=99367
Автор: AiratSA
Дата: 12.09.02
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как линкер линкует либы?
От: Андрей Галюзин Украина  
Дата: 13.02.04 13:55
Оценка:
B> Строго говоря, это зависит от самого линкера. Не помню уже деталей (давненько это было), но
B> не раз слышал, что какой-то борландовский линкер прилинковывал все целиком.
B> Но современные линкеры наверняка достаточно умны для того, чтобы линковать только то, что
B> дейстмительно используется.

Оно?
ms-help://MS.MSDNQTR.2003OCT.1033/vccore/html/_core_.2f.OPT.htm

The /OPT option controls the optimizations that LINK performs during a build. Optimizations generally decrease the image size and
increase the program speed at a cost of increased link time.
REF | NOREF
/OPT:REF eliminates functions and/or data that are never referenced while /OPT:NOREF keeps functions and/or data that are never
referenced.
LINK removes unreferenced packaged functions by default. An object contains packaged functions (COMDATs) if it has been compiled
with the /Gy option. This optimization is called transitive COMDAT elimination. To override this default and keep unreferenced
COMDATs in the program, specify /OPT:NOREF. You can use the /INCLUDE option to override the removal of a specific symbol.
If /DEBUG is specified, the default for /OPT is NOREF (otherwise, it is REF), and all functions are preserved in the image. To
override this default and optimize a debugging build, specify /OPT:REF. The /OPT:REF option disables incremental linking.
You have to explicitly mark data as a COMDAT; use __declspec(selectany).
If /OPT:REF is specified, /OPT:ICF is on by default. If you want /OPT:REF but not /OPT:ICF, you must specify the following:
link /opt:ref /opt:noicf
Specifying /OPT:ICF does not activate the /OPT:REF option.
...


--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[5]: Как линкер линкует либы?
От: LaptevVV Россия  
Дата: 13.02.04 13:59
Оценка:
Здравствуйте, Bell, Вы писали:

B>Нет, не очень

B>http://www.rsdn.ru/Forum/Message.aspx?mid=99367
Автор: AiratSA
Дата: 12.09.02

Не знаю, не знаю. в BCB каждый день че-нить для студентов проверяю — никаких метров в обычных консольных приложениях нет. Нормальный размер пару-тройку десятков кил, не больше.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Как линкер линкует либы?
От: achp  
Дата: 13.02.04 15:43
Оценка:
Здравствуйте, gybson.

Библиотека (.lib-файл в DOS/Windows, .a-файл в UNIX) — это просто сборище объектных файлов (.obj, .o), единственно для удобства обращения и для исключения некоторой повторяющейся в них информации объединенных "под одной крышей". С этой точки зрения и относится к ним сборщик.

А вот правила участия объектных файлов в сборке могут различаться. Иногда все тело объектного файла "вытягивается" по всякой ссылке (сборка на уровне объектных модулей), иногда нет (сборка на уровне функций/объектов). Теоретически, в последнем случае объектный файл должен быть устроен более тонко. Зато, в первом случае возможна ситуация, когда излишний код, попавший в сборку, "тянет" за собой другие модули, хотя они и не нужны, и т. д.
Re[2]: Как линкер линкует либы?
От: gybson  
Дата: 17.02.04 05:43
Оценка:
Я понимаю, что включается только то, что надо. Вопрос был еще и такой: "А знает ли линкер точно, что надо включить, чтобы работали функции подключенные из библиотек?". С функциями описанными в исходниках вопросов нет, там все ясно, а вот есть ли список зависимостей для функция находящихся в библиотеках, во всех ли библиотеках?
Re[3]: Как линкер линкует либы?
От: LaptevVV Россия  
Дата: 17.02.04 06:14
Оценка:
Здравствуйте, gybson, Вы писали:

G>Я понимаю, что включается только то, что надо. Вопрос был еще и такой: "А знает ли линкер точно, что надо включить, чтобы работали функции подключенные из библиотек?". С функциями описанными в исходниках вопросов нет, там все ясно, а вот есть ли список зависимостей для функция находящихся в библиотеках, во всех ли библиотеках?

Обычно в объектном модуле (а вовсе не в библиотеке) есть такая структура — словарь внешних символов. Там-то и прописываются все имена вызываемых функций.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Как линкер линкует либы?
От: Аноним  
Дата: 17.02.04 08:25
Оценка:
G>>Я понимаю, что включается только то, что надо. Вопрос был еще и такой: "А знает ли линкер точно, что надо включить, чтобы работали функции подключенные из библиотек?". С функциями описанными в исходниках вопросов нет, там все ясно, а вот есть ли список зависимостей для функция находящихся в библиотеках, во всех ли библиотеках?
LVV>Обычно в объектном модуле (а вовсе не в библиотеке) есть такая структура — словарь внешних символов. Там-то и прописываются все имена вызываемых функций.

Вопрос в том, есть ли там ещё и словарь внутренних символов.

А что он делает со static функциями.
По идее их имена линкеру вообще не видны, а для их вызова компилятор может использовать какие-то упрощённые конструкции (снижать степень косвенности).

А как там сейчас обстоит дело с определением адресов функций?
Помнится в ДОС была специальная таблица по которой пробегал загрузчик и правил адреса в коде загруженного exe-шника? Или я не прав?
А как сейчас? Править загруженные exe-шники вроде нельзя — файлы мапятся в память и под исправленные страницы надо создавать копии. А делать дополнительный уровень косвенности (вызовы через таблицу) — тоже не интересно.
Или сейчас все программы линкуются для работы по фиксированному адресу?
А как же тогда dll, точнее вызовы функций внутри dll?

Кому не лень, просветите народ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.