diff options
Diffstat (limited to 'libctf/testsuite')
7 files changed, 169 insertions, 101 deletions
diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c new file mode 100644 index 0000000..6541487 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c @@ -0,0 +1,5 @@ +typedef long a_t; +typedef long b_t; + +a_t *a; +b_t ignore2; diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c new file mode 100644 index 0000000..e458021 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c @@ -0,0 +1,5 @@ +typedef long a_t; +typedef long b_t; + +a_t b; +b_t ignore1; diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms.c new file mode 100644 index 0000000..ffe6983 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms.c @@ -0,0 +1,99 @@ +#include "config.h" +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int +main (int argc, char *argv[]) +{ + ctf_archive_t *ctf; + ctf_dict_t *a_fp, *ignore1_fp, *b_fp, *ignore2_fp, *tmp_fp; + int err; + ctf_id_t a, b, ignore1, ignore2, tmp; + char *foo; + ctf_next_t *i = NULL; + const char *name; + int val; + + if (argc != 2) + { + fprintf (stderr, "Syntax: %s PROGRAM\n", argv[0]); + exit(1); + } + + if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) + goto open_err; + + /* Fish out each symbol in turn: also try to fish out a nonexistent one. */ + + if ((a_fp = ctf_arc_lookup_symbol_name (ctf, "a", &a, &err)) == NULL) + goto sym_err; + printf ("Type of a is %s\n", foo = ctf_type_aname (a_fp, a)); + + if ((b_fp = ctf_arc_lookup_symbol_name (ctf, "b", &b, &err)) == NULL) + goto sym_err; + printf ("Type of b is %s\n", foo = ctf_type_aname (b_fp, b)); + + if ((ignore1_fp = ctf_arc_lookup_symbol_name (ctf, "ignore1", &ignore1, &err)) == NULL) + goto sym_err; + printf ("Type of ignore1 is %s\n", foo = ctf_type_aname (ignore1_fp, ignore1)); + + if ((ignore2_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", &ignore2, &err)) == NULL) + goto sym_err; + printf ("Type of ignore2 is %s\n", foo = ctf_type_aname (ignore2_fp, ignore1)); + + /* Try a call in just-get-the-dict mode and make sure it doesn't fail. */ + if ((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", NULL, &err)) == NULL) + goto sym_err; + ctf_dict_close (tmp_fp); + + /* Make sure failures fail. */ + if ((ctf_arc_lookup_symbol_name (ctf, "nonexistent", NULL, &err) != NULL) + || err != ECTF_NOTYPEDAT) + goto nosym_err; + + /* Fish them out again to check the caching layer. */ + if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "a", &tmp, &err)) != a_fp) + || (tmp != a)) + goto sym_cache_err; + ctf_dict_close (tmp_fp); + + if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "b", &tmp, &err)) != b_fp) + || (tmp != b)) + goto sym_cache_err; + ctf_dict_close (tmp_fp); + + if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore1", &tmp, &err)) != ignore1_fp) + || (tmp != ignore1)) + goto sym_cache_err; + ctf_dict_close (tmp_fp); + + if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", &tmp, &err)) != ignore2_fp) + || (tmp != ignore2)) + goto sym_cache_err; + ctf_dict_close (tmp_fp); + + ctf_dict_close (a_fp); + ctf_dict_close (b_fp); + ctf_dict_close (ignore1_fp); + ctf_dict_close (ignore2_fp); + ctf_close (ctf); + + return 0; + + open_err: + fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); + return 1; + sym_err: + fprintf (stderr, "%s: Symbol lookup error: %s\n", argv[0], ctf_errmsg (err)); + return 1; + nosym_err: + fprintf (stderr, "%s: Nonexistent symbol lookup unexpected error: %s\n", argv[0], + ctf_errmsg (err)); + return 1; + sym_cache_err: + fprintf (stderr, "%s: Symbol re-lookup error (caching bug): %s\n", argv[0], + ctf_errmsg (err)); + return 1; +} diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk b/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk new file mode 100644 index 0000000..09b41df --- /dev/null +++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk @@ -0,0 +1,7 @@ +# lookup: conflicting-type-syms.c +# source: conflicting-type-syms-a.c +# source: conflicting-type-syms-b.c +Type of a is a_t \* +Type of b is a_t +Type of ignore1 is b_t +Type of ignore2 is b_t diff --git a/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk b/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk new file mode 100644 index 0000000..548d67b --- /dev/null +++ b/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk @@ -0,0 +1,5 @@ +# lookup: enum-symbol.c +# source: enum-symbol-ctf.c +red1 has value 0 +green1 has value 1 +blue1 has value 2 diff --git a/libctf/testsuite/libctf-lookup/enum-symbol.c b/libctf/testsuite/libctf-lookup/enum-symbol.c index 4f63b61..c67478f 100644 --- a/libctf/testsuite/libctf-lookup/enum-symbol.c +++ b/libctf/testsuite/libctf-lookup/enum-symbol.c @@ -1,71 +1,19 @@ #include "config.h" -#include <bfd.h> -#include <elf.h> #include <ctf-api.h> -#include <swap.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -ssize_t symidx_64 (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name) -{ - const char *strs = (const char *) strsect->cts_data; - size_t i; - Elf64_Sym *sym = (Elf64_Sym *) s->cts_data; - for (i = 0; i < s->cts_size / s->cts_entsize; i++, sym++) - { - Elf64_Word nameoff = sym->st_name; -#ifdef WORDS_BIGENDIAN - if (little_endian) - swap_thing (nameoff); -#else - if (!little_endian) - swap_thing (nameoff); -#endif - if (strcmp (strs + nameoff, name) == 0) - return i; - } - return -1; -} - -ssize_t symidx_32 (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name) -{ - const char *strs = (const char *) strsect->cts_data; - size_t i; - Elf32_Sym *sym = (Elf32_Sym *) s->cts_data; - for (i = 0; i < s->cts_size / s->cts_entsize; i++, sym++) - { - Elf32_Word nameoff = sym->st_name; -#ifdef WORDS_BIGENDIAN - if (little_endian) - swap_thing (nameoff); -#else - if (!little_endian) - swap_thing (nameoff); -#endif - if (strcmp (strs + nameoff, name) == 0) - return i; - } - return -1; -} - int main (int argc, char *argv[]) { - ctf_dict_t *fp; - bfd *abfd; ctf_archive_t *ctf; - ctf_sect_t symsect; - ctf_sect_t strsect; - ssize_t symidx; + ctf_dict_t *fp, *tmp_fp; int err; - ctf_id_t type; + ctf_id_t type, tmp; ctf_next_t *i = NULL; const char *name; int val; - int little_endian; - - ssize_t (*get_sym) (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name); if (argc != 2) { @@ -73,53 +21,12 @@ main (int argc, char *argv[]) exit(1); } - /* Figure out the endianness of the symtab(s). */ - if ((abfd = bfd_openr (argv[1], NULL)) == NULL - || !bfd_check_format (abfd, bfd_object)) - goto bfd_open_err; - little_endian = bfd_little_endian (abfd); - bfd_close_all_done (abfd); - if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) goto open_err; - if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) - goto open_err; - - symsect = ctf_getsymsect (fp); - strsect = ctf_getstrsect (fp); - if (symsect.cts_data == NULL - || strsect.cts_data == NULL) - { - fprintf (stderr, "%s: no symtab or strtab\n", argv[0]); - return 1; - } - - ctf_dict_close (fp); - - if (symsect.cts_entsize != sizeof (Elf64_Sym) && - symsect.cts_entsize != sizeof (Elf32_Sym)) - { - fprintf (stderr, "%s: unknown symsize: %lx\n", argv[0], - symsect.cts_size); - return 1; - } - - switch (symsect.cts_entsize) - { - case sizeof (Elf64_Sym): get_sym = symidx_64; break; - case sizeof (Elf32_Sym): get_sym = symidx_32; break; - } - - if ((symidx = get_sym (&symsect, &strsect, little_endian, "primary1")) < 0) - { - fprintf (stderr, "%s: symbol not found: primary1\n", argv[0]); - return 1; - } - - /* Fish it out, then fish out all its enumerand/value pairs. */ + /* Fish out the enumerator, then fish out all its enumerand/value pairs. */ - if ((fp = ctf_arc_lookup_symbol (ctf, symidx, &type, &err)) == NULL) + if ((fp = ctf_arc_lookup_symbol_name (ctf, "primary1", &type, &err)) == NULL) goto sym_err; while ((name = ctf_enum_next (fp, type, &i, &val)) != NULL) @@ -129,21 +36,27 @@ main (int argc, char *argv[]) if (ctf_errno (fp) != ECTF_NEXT_END) goto nerr; + /* Fish it out again to check the caching layer. */ + if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "primary1", &tmp, &err)) != fp) + || (tmp != type)) + goto sym_cache_err; + + ctf_dict_close (tmp_fp); ctf_dict_close (fp); ctf_close (ctf); return 0; - bfd_open_err: - fprintf (stderr, "%s: cannot open: %s\n", argv[0], bfd_errmsg (bfd_get_error ())); - return 1; - open_err: fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); return 1; sym_err: fprintf (stderr, "%s: Symbol lookup error: %s\n", argv[0], ctf_errmsg (err)); return 1; + sym_cache_err: + fprintf (stderr, "%s: Symbol re-lookup error (caching bug): %s\n", argv[0], + ctf_errmsg (err)); + return 1; err: fprintf (stderr, "Lookup failed: %s\n", ctf_errmsg (ctf_errno (fp))); return 1; diff --git a/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c b/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c index d339963..98144de 100644 --- a/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c +++ b/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c @@ -98,6 +98,21 @@ try_maybe_reporting (int report) if (ctf_errno (fp) != ECTF_NEXT_END) goto iter_err; + /* Look up all the symbols by name and make sure that works. */ + + if (ctf_lookup_by_symbol_name (fp, "data_a") != base2) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "data_b") != base3) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "data_c") != base) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_a") != func2) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_b") != func3) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_c") != func) + goto lookup_syms_err; + /* Possibly report some but not all of the symbols, as if we are a linker (no real program would do this without using the ctf_link APIs, but it's not *prohibited*, just useless, and if they do we don't want things to @@ -121,6 +136,21 @@ try_maybe_reporting (int report) if (report_sym (fp, &sym, "func_c", 4, 2) < 0 || report_sym (fp, &sym, "func_a", 5, 2) < 0) goto report_err; + + /* Look up all the symbols by name now we have reported symbols. */ + + if (ctf_lookup_by_symbol_name (fp, "data_a") != base2) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "data_b") != base3) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "data_c") != base) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_a") != func2) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_b") != func3) + goto lookup_syms_err; + if (ctf_lookup_by_symbol_name (fp, "func_c") != func) + goto lookup_syms_err; } /* Write out, to memory. */ @@ -203,6 +233,10 @@ try_maybe_reporting (int report) expected_overshoot_err: fprintf (stderr, "Too many symbols in post-writeout comparison\n"); exit (1); + lookup_syms_err: + fprintf (stderr, "Explicit lookup of symbols by name failed: %s\n", + ctf_errmsg (ctf_errno (fp))); + exit (1); expected_compar_err: fprintf (stderr, "Non-dynamic iteration comparison failure: %s " "(type %lx): expected %s (type %lx)\n", symname, symtype, |