Функция утилиты ядра Linux, которая принимает строку символов в качестве входных данных и возвращает ее адрес

Есть ли API в Linux, который может дать мне адрес символа, переданного в виде ввода строки? Например, в приведенной ниже функции мне нужен тот же вывод, что и в отпечатке & begin1.

причина, по которой я нуждаюсь в этом программно, заключается в том, что у меня есть метки, такие как begin1, begin2, begin3 и т.д.... в моей программе, и мне нужно запустить цикл, чтобы получить их адреса.

extern void * begin1; int main (int argc, char ** argv) {char buf1 [30], buf2 [30];

int i= 1;
asm volatile ("nop;\n"
 "nop;\n"
 "begin1:\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "lbl1:\n"
 "nop;\n"
 "nop;\n"
 );


printf("&begin1 = %p\n", &begin1); //NEED THIS OUTPUT

sprintf(buf1, "begin%d",i);
sprintf(buf2,"lbl%d",i);

//Q: Can we pass buf1 as input to a kernel function that can give me the same output as above? 

return 0;
int i= 1;
asm volatile ("nop;\n"
 "nop;\n"
 "begin1:\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "nop;\n"
 "lbl1:\n"
 "nop;\n"
 "nop;\n"
 );


printf("&begin1 = %p\n", &begin1); //NEED THIS OUTPUT

sprintf(buf1, "begin%d",i);
sprintf(buf2,"lbl%d",i);

//Q: Can we pass buf1 as input to a kernel function that can give me the same output as above? 

return 0;

} }

1 ответ

Программа с main функцией не может быть кодом ядра. Код приложения запускается execve (2) -e.g. вашим shell- (и приложения взаимодействуют с ядром через syscalls, перечисленные в syscalls (2)...)

В Linux ваш код ядра часто является модулем ядра для некоторого настраиваемого драйвера.

Вы можете использовать dlopen (3) и dlsym (и вам нужно, чтобы символы были глобальными, поэтому используйте директиву .global в ассемблере). Затем вы хотите связать свою программу с флагом -rdynamic (и библиотекой -ldl), вызвать dlopen с помощью пути NULL и использовать dlsym для этого дескриптора программы.

Обратите внимание, что dlopen не является syscall (он использует open и mmap...)

Кстати, вас может заинтересовать GCC- метка в качестве расширения значений.

licensed under cc by-sa 3.0 with attribution.