C memcpy () функция - PullRequest
       66

C memcpy () функция

5 голосов
/ 11 ноября 2009

Есть ли метод для расчета размера функции? У меня есть указатель на функцию, и я должен скопировать всю функцию, используя memcpy. Я должен распределить немного пространства и знать 3-й параметр memcpy - size. Я знаю, что sizeof(function) не работает. Есть ли у вас какие-либо предложения?

Ответы [ 15 ]

0 голосов
/ 12 ноября 2009

Насколько я могу судить, оригинальный постер хочет сделать что-то, зависящее от реализации, и поэтому не переносимое; это выходит за рамки того, что в стандарте C ++ говорится о приведении указателей на функции, а не о стандарте C, но здесь этого должно быть достаточно.

В некоторых средах, с некоторыми компиляторами, может быть возможно сделать то, что, по-видимому, хочет сделать плакат (то есть скопировать блок памяти, на который указывает указатель на функцию, в другое место, возможно, выделенный с помощью malloc, приведите этот блок к указателю на функцию и вызовите его напрямую). Но это не будет портативным, что не может быть проблемой. Поиск размера, требуемого для этого блока памяти, сам по себе зависит от среды и компилятора и может очень потребовать некоторых довольно загадочных вещей (например, сканирование памяти на предмет кода возврата или запуск памяти через дизассемблер). Опять же, специфичный для реализации, и очень непереносимый. И опять же, может не иметь значения для оригинального постера.

Все ссылки на потенциальные решения, по-видимому, используют поведение, зависящее от реализации, и я даже не уверен, что они делают то, что подразумевается, но они могут подходить для ОП.

Побив эту лошадь до смерти, мне любопытно узнать, почему ОП хочет это сделать. Он будет довольно хрупким, даже если он работает в целевой среде (например, может порваться с изменениями параметров компилятора, версии компилятора, рефакторинга кода и т. Д.). Я рад, что я не делаю работу там, где такая магия необходима (при условии, что она есть) ...

0 голосов
/ 12 ноября 2009

Мое предложение: не надо.

Внедрение кода в пространство ядра - такая огромная дыра в безопасности, что в большинстве современных ОС вообще запрещают самоизменяющийся код .

0 голосов
/ 12 ноября 2009

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

0 голосов
/ 12 ноября 2009

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

0 голосов
/ 11 ноября 2009

Функция - это не просто объект, который вы можете скопировать. А как насчет перекрестных ссылок / символов и так далее? Конечно, вы можете взять что-то вроде стандартного пакета linux "binutils" и пытать ваши двоичные файлы, но это то, что вы хотите?

Кстати, если вы просто пытаетесь заменить реализацию memcpy (), посмотрите на механику LD_PRELOAD.

...