как я могу переопределить malloc (), calloc (), свободный () и т.д. под OS X?

Этот ответ не решает проблему ОП, но решает аналогичную.

У меня была похожая проблема (я получил error: cannot lock ref ... is at ... but expected ... ), но это было потому, что в репо было две ветви с одинаковым именем, но с другим регистром. Может быть, этот ответ может помочь людям, которые попадают сюда, я не смог найти ответ в другом месте. Я удалил одну из веток, а затем удалил соответствующую ссылку из: .git/ref/.../branch_name, затем git pull. Это происходит из-за того, что я работал над файловой системой без учета регистра, в то время как две ветви были перенесены в файловую систему с учетом регистра.

Например, две ветви - BRANCH1 и branch1, и они оба под origin дистанционно. Сначала удалите одну из ветвей, например BRANCH1. Затем удалите его ссылку:

rm .git/refs/remotes/origin/BRANCH1

Затем git pull, и все должно быть в порядке.

11
задан 30 May 2009 в 15:07
поделиться

4 ответа

Я бы использовал предварительную загрузку библиотеки для этой задачи, потому что она не требует модификации выполняющейся программы. Если вы знакомы с обычным способом Unix для этого, то это почти вопрос замены LD_PRELOAD на DYLD_INSERT_LIBRARIES.

Первый шаг - создать библиотеку с таким кодом, как этот, а затем построить ее, используя обычные параметры связывания разделяемых библиотек ( gcc -dynamiclib ):

void *malloc(size_t size)
{
    void * (*real_malloc)(size_t);
    real_malloc = dlsym(RTLD_NEXT, "malloc");

    fprintf(stderr, "allocating %lu bytes\n", (unsigned long)size);
    /* Do your stuff here */

    return real_malloc(size);
}

Обратите внимание, что если вы также отклоните calloc () и его вызовы реализации malloc () , вам может потребоваться дополнительный код для проверки как тебя зовут. Программы на C ++ должны быть довольно безопасными, потому что оператор new в любом случае вызывает malloc () , но имейте в виду, что ни один стандарт не требует этого. Я никогда не встречал реализации, которая не использовала бы malloc () , однако.

Наконец, настройте рабочую среду для вашей программы и запустите ее (может потребоваться корректировка в зависимости от того, как ваша оболочка обрабатывает среду переменных):

export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs

См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.

Этот метод довольно общий. Однако есть ограничения:

  • Вы не сможете переадресовывать прямые системные вызовы. Тем не менее, используйте malloc () .

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

    export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
    export DYLD_FORCE_FLAT_NAMESPACE=1
    yourprogram --yourargs
    

    См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.

    Этот метод довольно общий. Однако есть ограничения:

    • Вы не сможете переадресовывать прямые системные вызовы. Тем не менее, используйте malloc () .

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

      export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
      export DYLD_FORCE_FLAT_NAMESPACE=1
      yourprogram --yourargs
      

      См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.

      Этот метод довольно общий. Однако есть ограничения:

      • Вы не сможете переадресовывать прямые системные вызовы.
      • Если приложение обманывает вас, используя dlsym () для загрузки адреса malloc , вызов не будет перенаправлен. Если, однако, вы не обманете его, также отвлекая dlsym !
9
ответ дан 3 December 2019 в 08:31
поделиться

Если необходимую вам базовую статистику можно собрать в простой оболочке, быстрый (и своего рода грязный) трюк заключается в использовании некоторой замены макроса #define .

void* _mymalloc(size_t size)
{
    void* ptr = malloc(size);

    /* do your stat work? */

    return ptr;
}

и

#define malloc(sz_) _mymalloc(sz_)

Примечание : если макрос определен до определения _mymalloc, он в конечном итоге заменит вызов malloc внутри этой функции, оставляя вас с бесконечной рекурсией ... поэтому убедитесь, что это не кейс. Вы можете явно #undef указать его перед определением функции и просто (пере) определить его после, в зависимости от того, где вы его включите, чтобы избежать этой ситуации.

0
ответ дан 3 December 2019 в 08:31
поделиться

Я думаю, что если вы определите malloc () и free () в своем собственном файле .c, включенном в проект, компоновщик разрешит эту версию.

Итак, как вы собираетесь реализовать malloc?

0
ответ дан 3 December 2019 в 08:31
поделиться

Метод malloc_default_zone , упомянутый на http://lists.apple.com/archives/darwin-dev/2005/Apr/msg00050 .html , похоже, все еще работает, см., например, http://code.google.com/p/fileview/source/browse/trunk/fileview/fv_zone.cpp?spec=svn354&r=354 для пример использования, который кажется похожим на то, что вы намереваетесь.

3
ответ дан 3 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: