OpenBSD 5.9는 라이브러리를 미리 로드할 수 없습니다''

OpenBSD 5.9는 라이브러리를 미리 로드할 수 없습니다''

저는 Linux 및 OpenBSD를 대상으로 개발 중인데 가끔 오류 메시지가 나타납니다 can't preload library. 이것이 무엇을 의미하는지 아십니까?

내가 얻는 정확한 결과는 다음과 같습니다.

: can't preload library

스크립트 및/또는 바이너리를 실행하려고 할 때. 이것은 인용과 관련이 있는 것 같지만 확실하지 않습니다.

이 문제는 Linux에서는 발생하지 않으며 OpenBSD에서만 발생합니다.

여기에 이미지 설명을 입력하세요.

코드는여기그러나 나는 그것이 무엇을 하는지 모른다:

void
_dl_dopreload(char *paths)
{
    char        *cp, *dp;
    elf_object_t    *shlib;

    dp = paths = _dl_strdup(paths);
    if (dp == NULL) {
        _dl_printf("preload: out of memory");
        _dl_exit(1);
    }

    while ((cp = _dl_strsep(&dp, ":")) != NULL) {
        shlib = _dl_load_shlib(cp, _dl_objects, OBJTYPE_LIB,
        _dl_objects->obj_flags);
        if (shlib == NULL) {
            _dl_printf("%s: can't preload library '%s'\n",
                __progname, cp);
            _dl_exit(4);
        }
        _dl_add_object(shlib);
        _dl_link_child(shlib, _dl_objects);
    }
    _dl_free(paths);
    return;
}

여기에 내 스크립트가 있습니다. dashLinux용 OpenBSD:s Korn 쉘을 사용하여 실행하려고 합니다.

#!/bin/sh
echo "-- Testing our implementation of OpenShell --"
echo ""
echo "- If you have any problem in passing a test read the corresponding"
echo "- source file to understand what the test is checking"
echo ""
printf "********************* PRESS ENTER TO RUN TESTS  ... "
read _

# Key pressed, do something
printf "********************* TEST WILDCARDS \n***** Press any key to listing all files in current directory...\nYou should see filesnames *.* below "
read _
valgrind --leak-check=full -v ./shell << EOF
ls -al *.*
EOF
printf "********************* TEST ALGORITHMS ...  \n***** Press any key to run the algorithms... .\nYou should see the output from top -b -n1|head -8|tail -1 "
read _
top -b -n1|head -8|tail -1|sort -n|wc -l
valgrind --leak-check=full -v ./shell << EOF
ls|grep open
EOF

printf "********************* TEST ALGORITHMS Part II.  ... .\nYou should see the output from who|awk '{print \$4 ; print \$3}'|sort -n|wc -l. "
read _
valgrind --leak-check=full ./shell << EOF
who|awk '{print \$4 ; print \$3}'|sort -n|wc -l
EOF

printf "********************* TEST CHECKENV.  ..... .\nYou should see the output checkenv below "
read _
valgrind ./shell << EOF
checkenv
EOF
printf "********************* TEST DONE. YOU SHOULD SEE OUTPUT FROM TEST ABOVE ... "
read _

답변1

openbsd보안 측면에서 독특한 메모리 관리 개념이 있습니다. 그래서,정적 링크라이브러리를 미리 로드할 수 없습니다.

코드는 아래와 같이 표시됩니다.

        shlib = _dl_load_shlib(cp, _dl_objects, OBJTYPE_LIB,
        _dl_objects->obj_flags);
        if (shlib == NULL) {
            _dl_printf("%s: can't preload library '%s'\n",
                __progname, cp);
            _dl_exit(4);
        }

따라서 의 값을 shlib로 테스트해서는 안 됩니다 NULL.

로드해 보세요동적 링크대신 라이브러리가 작동해야 합니다.

관련 정보