Я предполагаю, что вы определяете malloc и free в файле main.cpp, который вы пытаетесь скомпилировать, и что mem_alloc и mem_free находятся в libmemnmf-0.a
Вероятно, происходит то, что для некоторых ссылок в main.cpp требуются объекты из glibc. В частности, что-то динамически загружает библиотеку (dlopen). Этот код включен в glibc (для ответа на вопрос 2).
Когда компоновщик включает объекты из glibc и обнаруживает, что эти объекты требуют символа malloc / free, он будет пытаться напрямую включить malloc / free из библиотеки glibc.
Из-за вашего флага компоновщика -static вся библиотека libmemnmf-0.a статически включена в ваш исполняемый файл. Это, очевидно, будет включать другой malloc и свободный объект в ваш исполняемый файл.
Что вам нужно сделать, это поместить подпрограммы malloc и free в отдельный файл .o и добавить этот файл где-нибудь в вашей команде link, предпочтительно в конце (при условии, что вы не указали для этого стандартную библиотеку особым образом). линия). Файл .o будет удовлетворять всем запросам символов, и библиотека glibc найдет эти совпадения разрешенными всякий раз, когда dlopen или другие объекты требуют их.
Разница в том, что файл libmnef-0.a является библиотекой, и компоновщики работают с библиотеками иначе, чем с простыми объектами (что связано с количеством проходов через библиотеку для разрешения символов, запрашиваемых объектами в этой библиотеке).
В качестве альтернативы, вы можете сбросить флаг -static, который, как я ожидаю, также решит проблему, но у вас, вероятно, есть веская причина включить этот флаг для начала.
Если вы хотите переопределить поведение new и delete, вы также можете обратиться к операторам перегрузки new и delete для классов, чтобы обеспечить метод распределения для конкретного класса или пул памяти.