Запретить статический символ для переопределения символа libc

У меня есть статическая библиотека, которую я не контролирую и которая определяет символ gettimeofday(). Основная функция должна использовать эту функцию, но я не хочу, чтобы она использовала функцию из библиотеки, я просто хочу, чтобы использовалась обычная функция из системы. Как сделать так, чтобы компоновщик предпочитал функцию из системных библиотек?
Я использую macOS и использую clang.
Вещи, которые я пробовал:

  • связывая библиотеку с -weak-l. Это не сработало. Я думал, что это приведет к тому, что «сильная» ссылка в системной библиотеке будет переопределять ссылку в статической библиотеке, но, видимо, этого не произошло. Может быть, значение слова «слабый» в macOS немного отличается от Linux?

  • изменение порядка командной строки компоновщика. Я попробовал поставить -lc перед статической библиотекой, но это не помогло. Я не совсем уверен, из какой библиотеки взят этот символ. Связанный вопрос: есть ли способ заставить ld сказать, из какой библиотеки он получил символ?

  • Я подумал о том, чтобы переименовать все символы в библиотеке, чтобы они имели какой-нибудь префикс, но llvm_objcopy, который, похоже, не поддерживает объекты Mach-O.

Вместо этого используйте clock_gettime.

jthill 22.08.2024 09:45

@jthill Хорошее нестандартное мышление!

Ian Abbott 22.08.2024 11:10

@IanAbbott, спасибо, на его странице руководства написано: «Приложения должны использовать функцию clock_gettime() вместо устаревшей функции gettimeofday()», поэтому создается впечатление, что она все еще находится внутри коробки.

jthill 22.08.2024 11:22

Это исправило бы проблему в данном конкретном случае, но есть несколько других функций, которым нет эквивалента.

shoosh 22.08.2024 14:06

Библиотека, которую вы пытаетесь использовать, очень усложняет жизнь. Используйте другую библиотеку или получите код и переименуйте определяемые им символы. Вас ждет мир боли, пока вы продолжаете его использовать.

Jonathan Leffler 22.08.2024 14:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы работаете на macOS, используйте -lSystem перед статической библиотекой, а не -lc.

В результате компоновщик выдаст предупреждение о том, что он «игнорирует повторяющиеся библиотеки: '-lSystem'». Если вы хотите избежать этого, вы можете использовать переключатель -v в Clang, чтобы он выводил используемую команду ссылки, а затем воспроизвести эту команду ссылки самостоятельно, опустив последующий -lSystem.

Это правильный ответ, спасибо!

shoosh 22.08.2024 17:12

Другие вопросы по теме