Перемещаемый код для библиотек .SO и .DLL - PullRequest
0 голосов
/ 17 февраля 2019

Я занимаюсь разработкой библиотеки C ++, которая требует включения некоторых внешних функций сборки.

В настоящее время функции C / C ++ объявляются таким образом (общий формат, а не точный код):

#if defined _WIN32
   #define DLL_ENTITY __declspec(dllexport)
#endif

#if defined _WIN32
   DLL_ENTITY
#endif
int Function (int argument);

и скомпилируйте его (используя Makefile) с GCC, используя флаг -fPIC для создания перемещаемого кода, который можно использовать из программ, связанных с моей библиотекой.Например (одна команда выводит мой Makefile):

g++ -I`pwd`/.. -Wall -fPIC -march=x86-64 -mtune=generic -g -c sort.cpp

, и в Windows я создаю и настраиваю проект с параметром DLL исполняемого формата в Visual Studio, затем он выполняет всю работу.

Хорошо, мои функции сборки выглядят так:

global function
global _function
function:
_function:
      ENTER reserved_bytes,nest_level
      ; ...get possible parameters...
      ; ...do something...
      LEAVE
      ret

Ну, согласно руководству NASM, для библиотек Windows DLL я должен добавить что-то вроде:

export function

Мои сомненияони:

1) В Linux ничего не говорится о «экспорте», я думаю, это так же, как и в прототипах функций / классов C / C ++, которые не требуют какой-либо специальной обработки, они объявлены втак же, как в автономных программах.Это правильно?Просто используйте «экспорт» для Windows и ничего для Linux?

2) Как насчет генерации перемещаемого кода?Для Windows ключевое слово «export» делает его перемещаемым или просто экспортируемым?И для Linux, мне нужно использовать какой-нибудь флаг, эквивалентный -fPIC, или я должен создать перемещаемый код с использованием BASED-адресации?Например:

  add WORD[BP+myNumber],10h

     instead of

  add WORD[myNumber],10h

но как в этом случае найти базовый адрес функции для установки ему BP (EBP / RBP) (на тот случай, если мне потребуется доступ к локальным переменным или данным)

...