Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связывание нескольких .cpp компилятором, Хранение функций во внешнем файле 
V
    Опции темы
warmonger_
Дата 20.1.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Извините, сказал не подумавши. smile 
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  20.1.2008,  22:22 Найти цитируемый пост)
как быть с callback-функциями?

А какая с ними проблема? smile

Цитата(MAKCim @  20.1.2008,  22:22 Найти цитируемый пост)
не забываем, что форматы файлов специфицированы и просто так добавить какую-то информацию туда нельзя  smile

Да ладно, если больно надо будет - добавят в формат что нужно. Или есть какая-то резкая необходимость использовать именно специфированный кем-то там(кем?) формат?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 21.1.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  21.1.2008,  04:13 Найти цитируемый пост)
Или есть какая-то резкая необходимость использовать именно специфированный кем-то там(кем?) формат? 

PE специфицирован
ELF тоже

Цитата(archimed7592 @  21.1.2008,  04:13 Найти цитируемый пост)
А какая с ними проблема? 

как ты такое отследишь?
Код

/* main.c */

int main() {
    return ((int (*)(void))dlsym(dlopen(NULL, RTLD_NOW), "foo"))();
}

Код

/* foo.c */

int foo(void) {
    return 0;
}
  
smile

Добавлено через 3 минуты и 38 секунд
так что с примером?  smile 
его фишка в том, что если компоновщик будет отслеживать зависимости, то в выходной файл не будет включена функция routine, что приведет к непредсказуемым последствиям


Это сообщение отредактировал(а) MAKCim - 21.1.2008, 10:28


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  21.1.2008,  10:28 Найти цитируемый пост)
PE специфицирован
ELF тоже

А компилятор разве генерирует PE или ELF? smile
Я же говорил о том, что компилятор будет вкладывать информацию в объектники smile.


Цитата(MAKCim @  21.1.2008,  10:28 Найти цитируемый пост)
как ты такое отследишь?

Очень просто: если линкуется с флагом -rdynamic, то включать все глобальные ф-ции с внешним связываением вне зависимости от того, используются они или нет smile. Ежу понятно, что из dll/so ничего выкидывать не нужно, ибо использоваться оно будет внешними программами.


Цитата(MAKCim @  21.1.2008,  10:28 Найти цитируемый пост)
так что с примером?

А ничего... Я тебе говорю о С++(С), а не об ассемблере. В случае с ассемблером - просто включать весь модуль полностью, ибо реверсить асм вредно для здоровья smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 21.1.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  21.1.2008,  15:42 Найти цитируемый пост)
А компилятор разве генерирует PE или ELF? smile
Я же говорил о том, что компилятор будет вкладывать информацию в объектники

объектные файлы являются форматными PE или ELF файлами
ELF формат, к примеру, специфицирует объектные, перемещаемые, исполняемые файлы, а также файлы динамических библиотек
с PE то же самое
Цитата(archimed7592 @  21.1.2008,  15:42 Найти цитируемый пост)
Ежу понятно, что из dll/so ничего выкидывать не нужно, ибо использоваться оно будет внешними программами.

DLL и SO тут вообще не причем
я просто привел один из способов вызова функции foo(), которая определена в отдельном модуле
причем компоновщик в этом случае просто не в состоянии определить, что foo на самом деле используется

Цитата(archimed7592 @  21.1.2008,  15:42 Найти цитируемый пост)
А ничего... Я тебе говорю о С++(С), а не об ассемблере. В случае с ассемблером - просто включать весь модуль полностью, ибо реверсить асм вредно для здоровья

ты наверное немного не в теме  smile 
компоновщик работает только с объектными файлами
а по ним невозможно определить, как они были получены: компиляцией кода на ЯВУ или трансляцией ассемблерного кода
вот есть две эквивалентные программы
Код

int main() { 
    return 0; 
}

и
Код

.text
main:
    xorl    %eax, %eax
    ret
.globl main

на выходе мы получим 2 объектных файла и невозможно будет определить, что один из них получен из исходника на ассемблере


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  21.1.2008,  17:28 Найти цитируемый пост)
объектные файлы являются форматными PE или ELF файлами

Понятно, и тем не менее: объектники не используются дальше, чем до передачи их линкеру, т.е. можно немного усовершенствовать формат от чего никто не пострадает, разве нет?


Цитата(MAKCim @  21.1.2008,  17:28 Найти цитируемый пост)
я просто привел один из способов вызова функции foo(), которая определена в отдельном модуле

Отлично, но чтобы упомянутый тобою способ работал нужно собрать исполняемый файл в таком режиме, когда все сущности с внешним связыванием засовываются в специальную таблицу экспорта, т.е. в дальнейшем исполняемый файл можно использовать как dll/so т.е. принципиальной разницы нет, так?


Цитата(MAKCim @  21.1.2008,  17:28 Найти цитируемый пост)
ты наверное немного не в теме  smile 
компоновщик работает только с объектными файлами

Возможно я и не в теме smile, но компилятор точно знает с чем он работает(асм или С/C++) и если он в состоянии(т.е., если он работает с C/C++), то ничто не мешает ему добавить эту информацию в объектник. Если же этой информации нет(т.е. компилятор был не в состоянии её добавить), то линкер вправе работать "по старинке".


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 21.1.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  21.1.2008,  17:42 Найти цитируемый пост)
т.е. можно немного усовершенствовать формат от чего никто не пострадает, разве нет?

хорошо, какие конкретно дополнительные данные ты предлагаешь помещать в объектный файл?
Цитата(archimed7592 @  21.1.2008,  17:42 Найти цитируемый пост)
Отлично, но чтобы упомянутый тобою способ работал нужно собрать исполняемый файл в таком режиме, когда все сущности с внешним связыванием засовываются в специальную таблицу экспорта, т.е. в дальнейшем исполняемый файл можно использовать как dll/so т.е. принципиальной разницы нет, так?

не понял
здесь обычный исполняемый файл, который собирается из 2-х модулей
в первом определена main(), во-втором - foo()
также есть ссылка на dlopen()/dlsym() из libdl.so
если компоновщик будет пытаться избавиться от ненужного "мусора", то в этот "мусор" попадет и foo(), которая на самом деле используется, но на которую нет прямой ссылки из объектного файла, где определена main()
Цитата(archimed7592 @  21.1.2008,  17:42 Найти цитируемый пост)
Если же этой информации нет(т.е. компилятор был не в состоянии её добавить), то линкер вправе работать "по старинке". 

ответь на первый вопрос


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  21.1.2008,  18:18 Найти цитируемый пост)
хорошо, какие конкретно дополнительные данные ты предлагаешь помещать в объектный файл?

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

Цитата(MAKCim @  21.1.2008,  18:18 Найти цитируемый пост)
не понял
здесь обычный исполняемый файл, который собирается из 2-х модулей

Не совсем обычный - он компонуется с ключем -rdynamic, а иначе он работать не будет, даже если foo не будет выкинута компоновщиком... разве нет?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
xvr
Дата 21.1.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Вообще то и gcc (точнее ld) и BCB давно умеют линковать только нужные функции в исполняемый файл. Достигается это очень просто - каждая функция помещается компилятором в свой собственный сегмент кода (отдельный от всех других). Линкер на этапе сборки выкидывает сегменты, к меткам, описанным в которых, нет ссылок.
Кстати, этот процесс во многом аналогичен линковке со статическими библиотеками, что есть вообще везде с самого начала.
PM MAIL   Вверх
MAKCim
Дата 21.1.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



xvr, 
гы
ты бы лучше сначала проверил, чем сразу утверждать  smile

Добавлено через 1 минуту и 38 секунд
Цитата(archimed7592 @  21.1.2008,  18:27 Найти цитируемый пост)
Не совсем обычный - он компонуется с ключем -rdynamic, а иначе он работать не будет, даже если foo не будет выкинута компоновщиком... разве нет?

да, все верно
но файл все равно останется исполняемым, только с расширенной таблицей .dynsym



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  21.1.2008,  21:48 Найти цитируемый пост)
но файл все равно останется исполняемым, только с расширенной таблицей .dynsym

Ну так вот, я на это ответил раньше(на изначально поставленный вопрос):
Цитата(archimed7592 @  21.1.2008,  15:42 Найти цитируемый пост)
Очень просто: если линкуется с флагом -rdynamic, то включать все глобальные ф-ции с внешним связываением вне зависимости от того, используются они или нет

Т.е., при компоновке с этим ключиком сущности с внешним связыванием не рассматриваются как кандидаты на исключение из итогового бинарника, ибо есть вероятность(раз этот ключик указан), что исполняемый файл будет использоваться как библиотека с динамическим связыванием.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 21.1.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  21.1.2008,  22:12 Найти цитируемый пост)
не рассматриваются как кандидаты на исключение из итогового бинарника

ничего не исключается 
идет лишь добавление символов в .dynsym, а она в свою очередь используется при поиске символов

Добавлено через 1 минуту и 31 секунду
вообщем, если подытожить, задача исключения сложна, но решаема
я в принципе обратного и не утверждал


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Так, Макс, блин, кому-то из нас двоих однозначно пора спать smile.

Ты спросил:
Цитата(MAKCim @  21.1.2008,  10:28 Найти цитируемый пост)
Цитата(archimed7592 @  21.1.2008,  04:13 Найти цитируемый пост)
А какая с ними проблема? 

как ты такое отследишь?
Код

/* main.c */

int main() {
    return ((int (*)(void))dlsym(dlopen(NULL, RTLD_NOW), "foo"))();
}

Код

/* foo.c */

int foo(void) {
    return 0;
}
  
smile
Я тебе ответил: отслежу по ключику -rdynamic. Если он есть, то добавляем все ф-ции вне зависимости от их реальной используемости(точно так же, как если бы мы собирали .so).


Теперь ты мне говоришь:
Цитата(MAKCim @  21.1.2008,  22:24 Найти цитируемый пост)
ничего не исключается 
С моей стороны вопрос: а где я сказал, что что-то исключается? smile

---------------------------------------------------------
Я, на всякий случай напомню предмет нашей беседы: тривиальна или нетривиальна задача исключения ненужного кода. Т.е. разговариваем мы с тобой о неком вымышленном тулчайне, в котором такая возможность будет и пытаемся понять возможен ли такой тулчайн в реальности, таким образом, даже если я говорю "что-то там куда-то там исключается", я имею в виду мой вымышленный компоновщик. Угу?

Добавлено через 49 секунд
Или не угу? smile

Добавлено через 5 минут и 4 секунды
Цитата(MAKCim @  21.1.2008,  22:24 Найти цитируемый пост)
вообщем, если подытожить, задача исключения сложна, но решаема
я в принципе обратного и не утверждал 

Вот даже как smile. Хорошо ты подытожил, красиво smile.
Давай я тоже подытожу: я не увидел ни NP-полноты задачи, ни необозримого множества ньансов, которые нужно предусмотреть, так что задача классическая: есть три ф-ции(A, B, C), причём A зависит от B, а B зависит от C, значит A зависит от B и С smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 21.1.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  21.1.2008,  22:35 Найти цитируемый пост)
Так, Макс, блин, кому-то из нас двоих однозначно пора спать 

рано  smile 
Цитата(archimed7592 @  21.1.2008,  22:35 Найти цитируемый пост)
Я тебе ответил: отслежу по ключику -rdynamic. Если он есть, то добавляем все ф-ции вне зависимости от их реальной используемости(точно так же, как если бы мы собирали .so).

да
Цитата(archimed7592 @  21.1.2008,  22:35 Найти цитируемый пост)
С моей стороны вопрос: а где я сказал, что что-то исключается?

Цитата(archimed7592 @  21.1.2008,  22:12 Найти цитируемый пост)
не рассматриваются как кандидаты на исключение из итогового бинарника

под исключением я подразумевал, что в текущей реализации компоновщика LD ничего не исключается, а секции выходного файла формируются из целых секций входных файлов
Цитата(archimed7592 @  21.1.2008,  22:35 Найти цитируемый пост)
я имею в виду мой вымышленный компоновщик. Угу?

вот
с этого и надо было начинать
тогда все стало на свои места  smile 
Цитата(archimed7592 @  21.1.2008,  22:35 Найти цитируемый пост)
Давай я тоже подытожу: я не увидел ни NP-полноты задачи, ни необозримого множества ньансов, которые нужно предусмотреть, так что задача классическая: есть три ф-ции(A, B, C), причём A зависит от B, а B зависит от C, значит A зависит от B и С

это теория
она абстрагирует от деталей, в которых обычно и кроются сложности
если все так просто, почему этого до сих пор нет в LD или других компоновщиках (хотя про другие не могу дать 100%-ой гарантии)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 21.1.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  21.1.2008,  22:50 Найти цитируемый пост)
рано  smile 

А я, с Вашего позволения, пойду подремлю smile.

Цитата(MAKCim @  21.1.2008,  22:50 Найти цитируемый пост)
если все так просто, почему этого до сих пор нет в LD или других компоновщиках

Конкретно про LD - думаю причина в том, что, либо используемый формат объектников дорабатывать будет дорогого стоить, а переходить на новый формат родит проблемы с совместимостью. Но тем не менее я не вижу ни одной серьёзной проблемы, чтобы воплотить в жизнь эту фичу.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.