2021-02-18 01:02:02 +08:00
|
|
|
-*- text -*-
|
|
|
|
|
include, libctf, ld: extend variable section to contain functions too
The CTF variable section is an optional (usually-not-present) section in
the CTF dict which contains name -> type mappings corresponding to data
symbols that are present in the linker input but not in the output
symbol table: the idea is that programs that use their own symbol-
resolution mechanisms can use this section to look up the types of
symbols they have found using their own mechanism.
Because these removed symbols (mostly static variables, functions, etc)
all have names that are unlikely to appear in the ELF symtab and because
very few programs have their own symbol-resolution mechanisms, a special
linker flag (--ctf-variables) is needed to emit this section.
Historically, we emitted only removed data symbols into the variable
section. This seemed to make sense at the time, but in hindsight it
really doesn't: functions are symbols too, and a C program can look them
up just like any other type. So extend the variable section so that it
contains all static function symbols too (if it is emitted at all), with
types of kind CTF_K_FUNCTION.
This is a little fiddly. We relied on compiler assistance for data
symbols: the compiler simply emits all data symbols twice, once into the
symtypetab as an indexed symbol and once into the variable section.
Rather than wait for a suitably adjusted compiler that does the same for
function symbols, we can pluck unreported function symbols out of the
symtab and add them to the variable section ourselves. While we're at
it, we do the same with data symbols: this is redundant right now
because the compiler does it, but it costs very little time and lets the
compiler drop this kludge and save a little space in .o files.
include/
* ctf.h: Mention the new things we can see in the variable
section.
ld/
* testsuite/ld-ctf/data-func-conflicted-vars.d: New test.
libctf/
* ctf-link.c (ctf_link_deduplicating_variables): Duplicate
symbols into the variable section too.
* ctf-serialize.c (symtypetab_delete_nonstatic_vars): Rename
to...
(symtypetab_delete_nonstatics): ... this. Check the funchash
when pruning redundant variables.
(ctf_symtypetab_sect_sizes): Adjust accordingly.
* NEWS: Describe this change.
2022-03-16 23:29:25 +08:00
|
|
|
Changes in 2.39:
|
|
|
|
|
|
|
|
* New features
|
|
|
|
|
|
|
|
** The CTF variable section (if generated via ld --ctf-variables) now contains
|
|
|
|
entries for static functions, hidden functions, and other functions with
|
|
|
|
no associated symbol. The associated type is of kind CTF_K_FUNCTION.
|
|
|
|
(No change if --ctf-variables is not specified, which is the default.)
|
|
|
|
|
2021-02-18 01:02:02 +08:00
|
|
|
Changes in 2.37:
|
|
|
|
|
|
|
|
* New features
|
|
|
|
|
|
|
|
** Add ctf_lookup_by_symbol name and ctf_arc_lookup_symbol_name, analogues of
|
|
|
|
existing ctf_lookup_by_symbol and ctf_arc_lookup_symbol, but looking up
|
|
|
|
symbols by name rather than symbol number. This also works in places where no
|
|
|
|
symbol number is known, like in object files and dynamic dicts created by
|
|
|
|
ctf_create.
|
|
|
|
|
libctf, include: support an alternative encoding for nonrepresentable types
Before now, types that could not be encoded in CTF were represented as
references to type ID 0, which does not itself appear in the
dictionary. This choice is annoying in several ways, principally that it
forces generators and consumers of CTF to grow special cases for types
that are referenced in valid dicts but don't appear.
Allow an alternative representation (which will become the only
representation in format v4) whereby nonrepresentable types are encoded
as actual types with kind CTF_K_UNKNOWN (an already-existing kind
theoretically but not in practice used for padding, with value 0).
This is backward-compatible, because CTF_K_UNKNOWN was not used anywhere
before now: it was used in old-format function symtypetabs, but these
were never emitted by any compiler and the code to handle them in libctf
likely never worked and was removed last year, in favour of new-format
symtypetabs that contain only type IDs, not type kinds.
In order to link this type, we need an API addition to let us add types
of unknown kind to the dict: we let them optionally have names so that
GCC can emit many different unknown types and those types with identical
names will be deduplicated together. There are also small tweaks to the
deduplicator to actually dedup such types, to let opening of dicts with
unknown types with names work, to return the ECTF_NONREPRESENTABLE error
on resolution of such types (like ID 0), and to print their names as
something useful but not a valid C identifier, mostly for the sake of
the dumper.
Tests added in the next commit.
include/ChangeLog
2021-05-06 Nick Alcock <nick.alcock@oracle.com>
* ctf.h (CTF_K_UNKNOWN): Document that it can be used for
nonrepresentable types, not just padding.
* ctf-api.h (ctf_add_unknown): New.
libctf/ChangeLog
2021-05-06 Nick Alcock <nick.alcock@oracle.com>
* ctf-open.c (init_types): Unknown types may have names.
* ctf-types.c (ctf_type_resolve): CTF_K_UNKNOWN is as
non-representable as type ID 0.
(ctf_type_aname): Print unknown types.
* ctf-dedup.c (ctf_dedup_hash_type): Do not early-exit for
CTF_K_UNKNOWN types: they have real hash values now.
(ctf_dedup_rwalk_one_output_mapping): Treat CTF_K_UNKNOWN types
like other types with no referents: call the callback and do not
skip them.
(ctf_dedup_emit_type): Emit via...
* ctf-create.c (ctf_add_unknown): ... this new function.
* libctf.ver (LIBCTF_1.2): Add it.
2021-05-06 16:30:58 +08:00
|
|
|
** libctf supports compilers that encode unrepresentable types via a special
|
|
|
|
kind (CTF_K_UNKNOWN) as well as via type ID 0.
|
|
|
|
|
2021-02-18 01:02:02 +08:00
|
|
|
* Bugfixes
|
|
|
|
|
|
|
|
** Avoid duplicating or losing types of data object symbols when
|
|
|
|
ld -r is used
|
|
|
|
|
|
|
|
** Prohibit typedefs with no name; prevent the linker/deduplicator
|
|
|
|
producing such typedefs
|
|
|
|
|
|
|
|
* Bugfixes, also on 2.36 branch
|
|
|
|
|
|
|
|
** Prevent ctf_lookup_by_name returning success when
|
|
|
|
looking up nonexistent pointer types
|
|
|
|
|
|
|
|
** Fix ctf_type_add copying of structs with unnamed members
|