Я занимаюсь разработкой библиотеки 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) (на тот случай, если мне потребуется доступ к локальным переменным или данным)