 build: Add symbol versions to all exported symbols
With this version script, newly-linked binaries that depend on the
json-c shared library will refer to its symbols in a versioned form,
preventing their references from being resolved to a symbol of the same
name exported by json-glib or libjansson if those libraries appear in
dependency search order before json-c, which will usually result in
a crash. This is necessary because ELF symbol resolution normally uses
a single flat namespace, not a tree like Windows symbol resolution.
At least one symbol (json_object_iter_next()) is exported by all three
JSON libraries.
Linking with -Bsymbolic is not enough to have this effect in all cases,
because -Bsymbolic only affects symbol lookup within a shared object,
for example when json_object_set_serializer() calls
json_object_set_userdata(). It does not affect calls from external
code into json-c, unless json-c was statically linked into the
external caller.
This change will also not prevent code that depends on json-glib or
libjansson from finding json-c's symbols and crashing; to prevent
that, a corresponding change in json-glib or libjansson would be needed.
Adding a symbol-version is a backwards-compatible change, but once
added, removing or changing the symbol-version on a symbol would be an
incompatible change that requires a SONAME bump.
Resolves: https://github.com/json-c/json-c/issues/621
(when combined with an equivalent change to libjansson).
Signed-off-by: Simon McVittie <smcv@collabora.com>
5 years ago  json_pointer: introduce json_pointer_get_internal() for internal usage
For JSON patch, we require that we get access to the parent of a JSON
object as well in order to do some operations via the API.
For example, given the object:
{
"foo": "bar",
"array", [ 1, 2, 3]
}
Using JSON pointer with the path
* '/foo' will return 'bar' of type string
* '/array/0' will return '1', of type integer
The problem is, that if we do 'json_object_put()' on any of the objects
above, this will not detach them from the parent, because there is no
information back to the parent.
One way to fix this, is to introduce links back to the parent, and have
these links be made by 'json_object_array_{put,insert}_idx()' and
'json_object_object_add{_ex}()'[1].
[1] For json_object_object_add_ex() we would need to de-constify the second
parameter, as we need to change it's internal state when being added to a
parent object. It may break some applications, but who knows.
But, since this information is needed mostly for JSON patch, another way to
address this, is to also retrieve the parent of an object via JSON pointer
and use json_object_object_del() and json_object_array_del_idx() on the
object's parent.
Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
4 years ago  build: Add symbol versions to all exported symbols
With this version script, newly-linked binaries that depend on the
json-c shared library will refer to its symbols in a versioned form,
preventing their references from being resolved to a symbol of the same
name exported by json-glib or libjansson if those libraries appear in
dependency search order before json-c, which will usually result in
a crash. This is necessary because ELF symbol resolution normally uses
a single flat namespace, not a tree like Windows symbol resolution.
At least one symbol (json_object_iter_next()) is exported by all three
JSON libraries.
Linking with -Bsymbolic is not enough to have this effect in all cases,
because -Bsymbolic only affects symbol lookup within a shared object,
for example when json_object_set_serializer() calls
json_object_set_userdata(). It does not affect calls from external
code into json-c, unless json-c was statically linked into the
external caller.
This change will also not prevent code that depends on json-glib or
libjansson from finding json-c's symbols and crashing; to prevent
that, a corresponding change in json-glib or libjansson would be needed.
Adding a symbol-version is a backwards-compatible change, but once
added, removing or changing the symbol-version on a symbol would be an
incompatible change that requires a SONAME bump.
Resolves: https://github.com/json-c/json-c/issues/621
(when combined with an equivalent change to libjansson).
Signed-off-by: Simon McVittie <smcv@collabora.com>
5 years ago |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
-
- /*
- * Symbol versioning for libjson-c.
- * All exported symbols must be listed here.
- *
- * See
- * https://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf
- */
-
- /*
- * Symbols in JSONC_PRIVATE are exported for historical
- * reasons, but should not be used outside of json-c.
- */
- JSONC_PRIVATE {
- array_list_add;
- array_list_del_idx;
- array_list_free;
- array_list_new;
- array_list_put_idx;
- array_list_sort;
- json_pointer_get_internal;
- json_hex_chars;
- json_parse_double;
- json_parse_int64;
- json_parse_uint64;
- lh_table_delete;
- lh_table_delete_entry;
- lh_table_free;
- lh_table_insert;
- lh_table_insert_w_hash;
- lh_table_new;
- lh_table_resize;
- mc_debug;
- mc_error;
- mc_get_debug;
- mc_info;
- mc_set_debug;
- mc_set_syslog;
- printbuf_free;
- printbuf_memappend;
- printbuf_memset;
- printbuf_new;
- printbuf_reset;
- sprintbuf;
- # Used by tests:
- _json_c_strerror;
- };
-
- JSONC_0.14 {
- global:
- array_list_bsearch;
- array_list_get_idx;
- array_list_length;
- json_c_get_random_seed;
- json_c_object_sizeof;
- json_c_set_serialization_double_format;
- json_c_shallow_copy_default;
- json_c_version;
- json_c_version_num;
- json_c_visit;
- json_global_set_string_hash;
- json_number_chars;
- json_object_array_add;
- json_object_array_bsearch;
- json_object_array_del_idx;
- json_object_array_get_idx;
- json_object_array_length;
- json_object_array_put_idx;
- json_object_array_sort;
- json_object_deep_copy;
- json_object_double_to_json_string;
- json_object_equal;
- json_object_free_userdata;
- json_object_from_fd;
- json_object_from_fd_ex;
- json_object_from_file;
- json_object_get;
- json_object_get_array;
- json_object_get_boolean;
- json_object_get_double;
- json_object_get_int64;
- json_object_get_int;
- json_object_get_object;
- json_object_get_string;
- json_object_get_string_len;
- json_object_get_type;
- json_object_get_uint64;
- json_object_get_userdata;
- json_object_int_inc;
- json_object_is_type;
- json_object_iter_begin;
- json_object_iter_end;
- json_object_iter_equal;
- json_object_iter_init_default;
- json_object_iter_next;
- json_object_iter_peek_name;
- json_object_iter_peek_value;
- json_object_new_array;
- json_object_new_boolean;
- json_object_new_double;
- json_object_new_double_s;
- json_object_new_int64;
- json_object_new_int;
- json_object_new_null;
- json_object_new_object;
- json_object_new_string;
- json_object_new_string_len;
- json_object_new_uint64;
- json_object_object_add;
- json_object_object_add_ex;
- json_object_object_del;
- json_object_object_get;
- json_object_object_get_ex;
- json_object_object_length;
- json_object_put;
- json_object_set_boolean;
- json_object_set_double;
- json_object_set_int64;
- json_object_set_int;
- json_object_set_serializer;
- json_object_set_string;
- json_object_set_string_len;
- json_object_set_uint64;
- json_object_set_userdata;
- json_object_to_fd;
- json_object_to_file;
- json_object_to_file_ext;
- json_object_to_json_string;
- json_object_to_json_string_ext;
- json_object_to_json_string_length;
- json_object_userdata_to_json_string;
- json_pointer_get;
- json_pointer_getf;
- json_pointer_set;
- json_pointer_setf;
- json_tokener_error_desc;
- json_tokener_free;
- json_tokener_get_error;
- json_tokener_get_parse_end;
- json_tokener_new;
- json_tokener_new_ex;
- json_tokener_parse;
- json_tokener_parse_ex;
- json_tokener_parse_verbose;
- json_tokener_reset;
- json_tokener_set_flags;
- json_type_to_name;
- json_util_get_last_err;
- lh_char_equal;
- lh_kchar_table_new;
- lh_kptr_table_new;
- lh_ptr_equal;
- lh_table_length;
- lh_table_lookup_entry;
- lh_table_lookup_entry_w_hash;
- lh_table_lookup_ex;
-
- local:
- *;
- };
-
- JSONC_0.15 {
- global:
- array_list_new2;
- array_list_shrink;
- json_object_array_shrink;
- json_object_new_array_ext;
- } JSONC_0.14;
-
- JSONC_0.16 {
- global:
- json_object_array_insert_idx;
- json_patch_apply;
- } JSONC_0.15;
-
- JSONC_0.17 {
- # global:
- # ...new symbols here...
- } JSONC_0.16;
|