Home | History | Annotate | Line # | Download | only in ld.elf_so
t_dlinfo.c revision 1.6
      1  1.6      maya /*	$NetBSD: t_dlinfo.c,v 1.6 2019/07/09 16:24:01 maya Exp $	*/
      2  1.1     pooka 
      3  1.1     pooka /*
      4  1.1     pooka  * Copyright (c) 2009 The NetBSD Foundation, Inc.
      5  1.1     pooka  * All rights reserved.
      6  1.1     pooka  *
      7  1.1     pooka  * Redistribution and use in source and binary forms, with or without
      8  1.1     pooka  * modification, are permitted provided that the following conditions
      9  1.1     pooka  * are met:
     10  1.1     pooka  * 1. Redistributions of source code must retain the above copyright
     11  1.1     pooka  *    notice, this list of conditions and the following disclaimer.
     12  1.1     pooka  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1     pooka  *    notice, this list of conditions and the following disclaimer in the
     14  1.1     pooka  *    documentation and/or other materials provided with the distribution.
     15  1.1     pooka  *
     16  1.1     pooka  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
     17  1.1     pooka  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
     18  1.1     pooka  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19  1.1     pooka  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  1.1     pooka  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
     21  1.1     pooka  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22  1.1     pooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     23  1.1     pooka  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     24  1.1     pooka  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
     25  1.1     pooka  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     26  1.1     pooka  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27  1.1     pooka  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  1.1     pooka  */
     29  1.1     pooka 
     30  1.1     pooka #include <sys/types.h>
     31  1.1     pooka 
     32  1.1     pooka #include <atf-c.h>
     33  1.1     pooka #include <dlfcn.h>
     34  1.1     pooka #include <link_elf.h>
     35  1.1     pooka 
     36  1.5  christos #include "h_macros.h"
     37  1.1     pooka 
     38  1.1     pooka ATF_TC(rtld_dlinfo_linkmap_self);
     39  1.1     pooka ATF_TC_HEAD(rtld_dlinfo_linkmap_self, tc)
     40  1.1     pooka {
     41  1.1     pooka 	atf_tc_set_md_var(tc, "descr", "dlinfo with RTLD_SELF handle works");
     42  1.1     pooka }
     43  1.1     pooka ATF_TC_BODY(rtld_dlinfo_linkmap_self, tc)
     44  1.1     pooka {
     45  1.1     pooka 	struct link_map *map;
     46  1.1     pooka 	int rv;
     47  1.1     pooka 
     48  1.1     pooka 	rv = dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
     49  1.1     pooka 	ATF_CHECK_EQ(rv, 0);
     50  1.1     pooka 	ATF_CHECK((strstr(map->l_name, "t_dlinfo") != NULL));
     51  1.1     pooka }
     52  1.1     pooka 
     53  1.1     pooka ATF_TC(rtld_dlinfo_linkmap_inval);
     54  1.1     pooka ATF_TC_HEAD(rtld_dlinfo_linkmap_inval, tc)
     55  1.1     pooka {
     56  1.1     pooka 	atf_tc_set_md_var(tc, "descr", "dlinfo with invalid handle fails");
     57  1.1     pooka }
     58  1.1     pooka ATF_TC_BODY(rtld_dlinfo_linkmap_inval, tc)
     59  1.1     pooka {
     60  1.1     pooka 	void *v;
     61  1.1     pooka 	int rv;
     62  1.1     pooka 
     63  1.1     pooka 	rv = dlinfo(NULL, RTLD_DI_LINKMAP, &v);
     64  1.1     pooka 	ATF_CHECK_EQ(rv, -1);
     65  1.1     pooka }
     66  1.1     pooka 
     67  1.1     pooka ATF_TC(rtld_dlinfo_linkmap_dlopen);
     68  1.1     pooka ATF_TC_HEAD(rtld_dlinfo_linkmap_dlopen, tc)
     69  1.1     pooka {
     70  1.1     pooka 	atf_tc_set_md_var(tc, "descr", "dlinfo dlopen'd handle works");
     71  1.1     pooka }
     72  1.1     pooka ATF_TC_BODY(rtld_dlinfo_linkmap_dlopen, tc)
     73  1.1     pooka {
     74  1.1     pooka 	struct link_map *map;
     75  1.1     pooka 	void *handle;
     76  1.1     pooka 	int rv;
     77  1.1     pooka 
     78  1.1     pooka 	handle = dlopen("libutil.so", RTLD_LAZY);
     79  1.1     pooka 	ATF_CHECK(handle);
     80  1.1     pooka 
     81  1.1     pooka 	rv = dlinfo(handle, RTLD_DI_LINKMAP, &map);
     82  1.1     pooka 	ATF_CHECK_EQ(rv, 0);
     83  1.1     pooka 	ATF_CHECK((strstr(map->l_name, "libutil.so") != NULL));
     84  1.1     pooka 	dlclose(handle);
     85  1.1     pooka }
     86  1.1     pooka 
     87  1.3     pooka ATF_TC(rtld_dlinfo_linkmap_dlopen_iter);
     88  1.3     pooka ATF_TC_HEAD(rtld_dlinfo_linkmap_dlopen_iter, tc)
     89  1.3     pooka {
     90  1.3     pooka 	atf_tc_set_md_var(tc, "descr", "dlopen'd dso's show up in the list");
     91  1.3     pooka }
     92  1.3     pooka ATF_TC_BODY(rtld_dlinfo_linkmap_dlopen_iter, tc)
     93  1.3     pooka {
     94  1.3     pooka 	struct link_map *map;
     95  1.3     pooka 	void *handle;
     96  1.3     pooka 
     97  1.3     pooka 	handle = dlopen("libutil.so", RTLD_LAZY);
     98  1.3     pooka 	ATF_CHECK(handle);
     99  1.3     pooka 
    100  1.3     pooka 	RZ(dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map));
    101  1.3     pooka 
    102  1.3     pooka 	for (; map->l_next; map = map->l_next)
    103  1.3     pooka 		continue;
    104  1.3     pooka 	for (; map; map = map->l_prev)
    105  1.3     pooka 		if (strstr(map->l_name, "libutil.so") != NULL)
    106  1.3     pooka 			break;
    107  1.3     pooka 
    108  1.3     pooka 	ATF_REQUIRE_MSG(map, "dlopen()d object not found from linkmap");
    109  1.4     pooka 	ATF_REQUIRE_MSG(dlopen(map->l_name, RTLD_LAZY) != NULL,
    110  1.4     pooka 	    "could not dlopen() name in linkmap");
    111  1.3     pooka }
    112  1.3     pooka 
    113  1.1     pooka ATF_TP_ADD_TCS(tp)
    114  1.1     pooka {
    115  1.1     pooka 	ATF_TP_ADD_TC(tp, rtld_dlinfo_linkmap_self);
    116  1.1     pooka 	ATF_TP_ADD_TC(tp, rtld_dlinfo_linkmap_inval);
    117  1.1     pooka 	ATF_TP_ADD_TC(tp, rtld_dlinfo_linkmap_dlopen);
    118  1.3     pooka 	ATF_TP_ADD_TC(tp, rtld_dlinfo_linkmap_dlopen_iter);
    119  1.6      maya 	return atf_no_error();
    120  1.1     pooka }
    121