2014-01-13 1 views
0

Я прочитал эту статью (http://qasim.zaidi.me/2009/05/overriding-system-call-in-aix.html;) об переопределении системного вызова в aix;ld: 0711-224 warning: Дублирующий символ (Переопределение системного вызова в AIX)

Я написал два расширения ядра, как и в статье: «Первое расширение ядра просто реэкспортирует исходный системный вызов с другим именем. Второе, на самом деле переопределит syscall, переопределив его, а затем вызовет оригинал один из которых экспортируется первым модулем ».

Но есть ошибка, когда я делаю второе расширение:

1> gcc -O2 -maix64 -ffreestanding -o my_syscall.o -c my_syscall.c -D_KERNEL 
1> ld -b64 -o my_syscall my_syscall.o -e my_syscall_init -bI:/home/rabbitte/output/test_system/my_syscall.exp -bI:/usr/lib/kernex.exp -lsys -lcsys 
1>ld : 0711-224 warning : Duplicate symbol: .getpid 
1> ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information. 

Файл «/home/rabbitte/output/test_system/my_syscall.exp» является файл экспорта первого расширения. Я не понимаю, что означает «Дублирующий символ: .getpid». Не могли бы вы рассказать мне, как решить эту проблему?

Большое спасибо.

+0

Позвольте мне прочитать статью и поиграть с ней. Очень часто дублирующиеся предупреждения символов можно игнорировать. Является ли статус выхода ld 0? т.е. echo $? как следующая команда после ld. – pedz

ответ

0

Я никогда этого не делал, поэтому этого может быть недостаточно, чтобы решить вашу проблему, но ваша линкера имеет два параметра -bI. Он должен быть -bI для AIX kernex.exp и -bE для вашего файла exp в соответствии с документами, на которые вы указываете.

+0

Спасибо. Kernex.exp - это файл экспорта системы. И «kernex.exp» также является файлом, который был экспортирован первым расширением ядра. Поэтому для обоих этих файлов необходимо использовать -bI. – edsionte

1

Причина в том, что файл «kernex.exp» также включает в себя символ «getpid». Я должен прокомментировать getpid в файле kernex.exp.

+0

Я прочитал статью. Он говорит о двух расширениях ядра. Я подозреваю, что вы получаете повторяющуюся ошибку в той, которая определяет новый getpid. Да ... вам не нужно говорить, что вы получите getpid из ядра, потому что это не так. Я бы создал пользовательский файл импорта (который может быть пустым) и добавить символы из kernexp, необходимые для второго модуля. Вы также можете сделать эту обманку с библиотеками, помещенными в LIBPATH, и вообще не иметь расширения ядра. Это делает ptrace. Я также * думаю * есть способ сделать это за один шаг. Линкер очень универсален. – pedz