LINUX.ORG.RU

GDB выдает ошибку, если включить незадействованные исходники.

 


0

1

Нужно протестировать модули крипто-API в ядре. В доках kernel.org сказано было, что пример работы с ними для user-space - библиотека libkcapi.

Скачал «apt source libkcapi», все исходники там в подкаталоге lib. Скопировал lib себе в проект, чтобы слинковать статически. Makefile примитивный.

EXE = test

OBJS = lib/kcapi-asym.o lib/kcapi-kdf.o lib/kcapi-kernel-if.o lib/kcapi-kpp.o lib/kcapi-md.o lib/kcapi-rng.o lib/kcapi-sym.o lib/kcapi-utils.o lib/kcapi-aead.o
OBJS += main.o

CFLAGS = -g -O0 
#CFLAGS += -enable-frame-pointer -fno-omit-frame-pointer

all: $(EXE)

$(EXE): $(OBJS)
	gcc -o $(EXE) $(OBJS)

.o: .c
	gcc -c $< $(CFLAGS)

clean:
	rm $(EXE) $(OBJS)

Сам тест начал только писать с хелловорлда


#include <stdlib.h>
#include <stdio.h>
#include "lib/kcapi.h"

int main(int argc, char *argv[])
{
	printf( "Hello world!" );
    return 0;
}

Без либы собирается 17К, с либой 131К. Ничего из функций либы не используется так и так. Без либы дебаггер проходит main, билд с исходниками либы зависает и в консоли gdb следующее:

... bla-bla-bla ...
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) Cannot remove breakpoints because program is no longer writable.                                                                                                                               
Further execution is probably impossible.

Breakpoint 1, main (argc=<error reading variable: Cannot access memory at address 0x7fffffffdfcc>, argv=<error reading variable: Cannot access memory at address 0x7fffffffdfc0>) at main.c:8
8               printf( "Hello world!" );
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.

Breakpoint 1, main (argc=<error reading variable: Cannot access memory at address 0x7fffffffdfcc>, argv=<error reading variable: Cannot access memory at address 0x7fffffffdfc0>) at main.c:8
8               printf( "Hello world!" );

Как это может быть и что с этим делать? Чистый gdb без eclipse дает то же. Что-то с исходниками либы не так?

Ответ на: комментарий от firkax

Ну естественно я sudo gdb запустил для отладки своего приложения

/home/user/PROJECTS/test_kcapi/test$ sudo gdb test 
GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
....
bla-bla-bla, copyright, license...
....
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb) b main
Breakpoint 1 at 0x7c52: file main.c, line 8.
(gdb) run
Starting program: /home/user/PROJECTS/test_kcapi/test/test 

Breakpoint 1, main (argc=1, argv=0x7fffffffe5d8) at main.c:8
8               printf( "Hello world!\n" );
(gdb) n
Hello world!
9           return 0;
(gdb) n
10      }
(gdb) n
.....
bugs-bunny
() автор топика
Ответ на: комментарий от firkax

Выходит да, до запуска, как в первом логе. А что до запуска делается, загрузка либ? Так специально ничего не линковалось, с любым составом исходников либы одни.

        linux-vdso.so.1 (0x00007ffe0a751000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1494cbe000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1494ed0000)

Мож какие-то функции могут вызываться только от рута и это как-то отмечено в либе? Но это уже фантазии. Или аттрибуты какой-то секции кода кроме exec не writable и gdb туда не может int3 поставить.

Я еще думал, что может быть что-то вызывает функция _start для инициализиции, если находит например указатель на это. Но тут то не выполняется еще ничего.

bugs-bunny
() автор топика