(я знаю, что это старый вопрос, но я записываю здесь ответ для будущих разработчиков)
Проблема заключалась в попытке поместить значение mode / flags в ebx, когда оно должно было быть помещено в edx. В следующей статье описывается, как вызывать _dl_open вручную в контексте внедрения библиотеки:
http://www.ars -informatica.com / Root / Код / 2010_04_18 / LinuxPTrace.aspx
Они определяют _dl_open как:
void *
internal_function
_dl_open(const char *file, int mode, const void *caller);
Хотя символ экспортируется libc, он все еще определяется как внутренняя функция, то есть его параметры передаются через регистры следующим образом:
EAX = const char *file
ECX = const void *caller
EDX = int mode