Subject: using libjansson in postgres extension

From: mahendrakar s <[email-masked]>
Date: Thu, 23 Feb 2023 19:08:50 +0530

Hello Hackers,

I'm developing an extension where in it indirectly references (libjansson)
and libjansson has a symbol json_object
<https://github.com/akheron/jansson/blob/master/src/load.c#:~:text=json_t%20*object%20%3D%20json_object()%3B>which
conflicts with postgres  symbol 'json_object
<https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/json.c#:~:text=json_object(PG_FUNCTION_ARGS)>
'.

I see below:
PostgreSQL: Documentation: 11: 38.10. C-Language Functions
<https://www.postgresql.org/docs/11/xfunc-c.html#id-1.8.3.13.8>
"Symbol names defined within object files must not conflict with each other
or with symbols defined in the PostgreSQL server executable. You will have
to rename your functions or variables if you get error messages to this
effect."

But this requires to maintain libjansson with customizations(have a
different symbol) to meet the needs.

Do you have any suggestions to use the libjansson 'as it is' without using
the different symbol.

Thanks,
Mahendrakar.

---

From: mahendrakar s <[email-masked]>
Date: Fri, 24 Feb 2023 07:29:23 +0530

+andrew.
Thoughts?

On Thu, 23 Feb 2023 at 19:08, mahendrakar s <[email-masked]>
wrote:

> "Symbol names defined within object files must not conflict with each
> other or with symbols defined in the PostgreSQL server executable. You will
> have to rename your functions or variables if you get error messages to
> this effect."
>

---

From: Gurjeet Singh <[email-masked]>
Date: Thu, 23 Feb 2023 23:30:40 -0800

On Thu, Feb 23, 2023 at 5:39 AM mahendrakar s
<[email-masked]> wrote:
> I'm developing an extension where in it indirectly references (libjansson) and libjansson has a symbol json_object which conflicts with postgres  symbol 'json_object'.
>
> I see below:
> "Symbol names defined within object files must not conflict with each other or with symbols defined in the PostgreSQL server executable. You will have to rename your functions or variables if you get error messages to this effect."
>
> But this requires to maintain libjansson with customizations(have a different symbol) to meet the needs.
>
> Do you have any suggestions to use the libjansson 'as it is' without using the different symbol.

I don't think that'll be possible. The docs are pretty clear, and I'm
afraid any proposal to change Postgres function's name will not be
welcome.

Perhaps you can perform surgery on your library _after_ linking, to
remove any exports of the symbol json_object. See [1] for some ideas.
This will allow you to keep using libjansson code without
modifications, but it will require some post-build complexity, with
platform-specific solutions.

[1]: https://stackoverflow.com/questions/9648655/how-to-hide-the-exported-symbols-name-within-a-shared-library

Best regards,
Gurjeet
http://Gurje.et

---

From: Andrew Dunstan <[email-masked]>
Date: Sat, 25 Feb 2023 10:54:52 -0500

On 2023-02-23 Th 20:59, mahendrakar s wrote:
>
> On Thu, 23 Feb 2023 at 19:08, mahendrakar s 
>     I'm developing an extension where in it indirectly references
>     (libjansson) and libjansson has a symbol json_object
>     <https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/json.c#:~:text=json_object(PG_FUNCTION_ARGS)>'.
>
>     I see below:
>     "Symbol names defined within object files must not conflict with
>     each other or with symbols defined in the PostgreSQL server
>     executable. You will have to rename your functions or variables if
>     you get error messages to this effect."
>

No. AFAICT you will have to create a fork of the library as the 
documentation suggests.

cheers

andrew

--
Andrew Dunstan
EDB:https://www.enterprisedb.com