Как я могу вызвать __strlen_sse2 из программы C / C ++? [Linux] - PullRequest
2 голосов
/ 31 января 2011

Я безоговорочно скажу, что я не программист, и, вероятно, у меня над головой.

Я пытаюсь отследить ошибку в функции __strlen_sse2 (сборка), установленной в Debian как часть libc6-i686.

У меня уже есть копия ассемблерного кода (файл .S), и мне нужно найти способ вызвать его из программы на C / C ++. Как мне этого добиться?

редактировать:

Пробовал этот код, но я получаю ошибку от gcc о неопределенной ссылке на '__strlen_sse2'

edit 2: Насколько я понимаю, это правильный ответ на вопрос, но мне не хватает необходимых знаний, чтобы довести его до конца. Спасибо всем за помощь.

#include <stdio.h>
#include <string.h>

size_t __strlen_sse2(const char *);

void main()
{
    char buffer[255];

    printf("Standby.. ");
    gets(buffer);
    __strlen_sse2("CRASH!");
    printf("OK!\n");
}

Как я уже сказал ... не программист.

Надеюсь, мой вопрос имеет смысл. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Вы не можете напрямую вызвать копию __strlen_sse2 внутри обычного, динамически связанного /lib/libc.so.6, потому что это «скрытый символ» - доступный для кода внутри самой libc, но недоступный для внешних ссылок.

Вы говорите, что у вас есть файл .S, который определяет __strlen_sse2, из исходного кода glibc, но вам нужно будет изменить его, чтобы его можно было собирать вне glibc. Я нашел то, что считаю правильным файлом, и смог довольно легко его изменить. Удалите все до, но не включая строку, которая читает только

        .text

и замените его следующим:

#define PUSH(REG)       pushl REG
#define POP(REG)        popl REG
#define PARMS           4
#define STR             PARMS
#define ENTRANCE
#define RETURN          ret
#define L(x)            .L##x
#define ENTRY(x)        .globl x; .type x,@function; x:
#define END(x)          .size x, .-x

Также удалите строку #endif в самом конце файла. Затем скомпилируйте так:

gcc -m32 -c strlen-sse2.S
gcc -m32 -c test.c
gcc -m32 test.o strlen-sse2.o
./a.out

Возможно, вам не нужны -m32 с.

Возможно, вам удастся получить помощь в решении более крупной проблемы на superuser.com - укажите содержание /proc/cpuinfo в вашем вопросе.

1 голос
/ 31 января 2011

Просто объявите функцию, желательно с полным прототипом, и вызовите ее. Это, вероятно, правильный прототип:

size_t __strlen_sse2(const char *);

Я немного скептически отношусь к вашему заявлению о том, что вы пытаетесь отследить ошибку в этой функции. Скорее всего, в вашей программе есть ошибка, которая вызывает strlen с недопустимым аргументом (либо недопустимый указатель, либо указатель на что-то, кроме строки с нулевым символом в конце).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...