diff mbox

[uclibc-ng-devel,1/2] ldso: Consistently set & use DL_OPENED flag in both ld.so and libdl

Message ID 1466443785-4311-2-git-send-email-lly.dev@gmail.com
State RFC
Headers show

Commit Message

Leonid Lisovskiy June 20, 2016, 5:29 p.m. UTC
Previously, DL_OPENED flag was set in libdl only and never used.
Set it centralized in _dl_load_elf_shared_library() & use it in
both ld.so and libdl.
Additionally, rename it to DL_OPENED2 for clarity.

Signed-off-by: Leonid Lisovskiy <lly.dev@gmail.com>
---
 ldso/include/dl-hash.h | 2 +-
 ldso/ldso/dl-elf.c     | 1 +
 ldso/ldso/ldso.c       | 8 +++++---
 ldso/libdl/libdl.c     | 4 +---
 4 files changed, 8 insertions(+), 7 deletions(-)

Comments

Waldemar Brodkorb June 21, 2016, 7:10 p.m. UTC | #1
Hi Leonid,
Leonid Lisovskiy wrote,

> Previously, DL_OPENED flag was set in libdl only and never used.
> Set it centralized in _dl_load_elf_shared_library() & use it in
> both ld.so and libdl.
> Additionally, rename it to DL_OPENED2 for clarity.

What needs to be clarified?
A DL_OPENED2 without DL_OPENED looks strange to me.
Isn't git log enough to see what has changed?

best regards
 Waldemar
Leonid Lisovskiy June 22, 2016, 7:45 a.m. UTC | #2
On Tue, Jun 21, 2016 at 10:10 PM, Waldemar Brodkorb <wbx@uclibc-ng.org> wrote:
> Hi Leonid,
> Leonid Lisovskiy wrote,
>
>> Previously, DL_OPENED flag was set in libdl only and never used.
>> Set it centralized in _dl_load_elf_shared_library() & use it in
>> both ld.so and libdl.
>> Additionally, rename it to DL_OPENED2 for clarity.
>
> What needs to be clarified?
> A DL_OPENED2 without DL_OPENED looks strange to me.
> Isn't git log enough to see what has changed?

At now, logic of use of DL_OPENED flag lost in space. Many years ago,
it was used to mark that fact what library was opened. It destroyed by
commits in 2005-2006 years, so it is near impossible to get additional
information about it.

Currently, we need just to know that library was opened more than
once. Sorry if DL_OPENED2 name introduces misunderstanding, I could
easily rename it to any better variant.


Regards,
   Leonid
Waldemar Brodkorb June 22, 2016, 6:18 p.m. UTC | #3
Hi,
Leonid Lisovskiy wrote,

> On Tue, Jun 21, 2016 at 10:10 PM, Waldemar Brodkorb <wbx@uclibc-ng.org> wrote:
> > Hi Leonid,
> > Leonid Lisovskiy wrote,
> >
> >> Previously, DL_OPENED flag was set in libdl only and never used.
> >> Set it centralized in _dl_load_elf_shared_library() & use it in
> >> both ld.so and libdl.
> >> Additionally, rename it to DL_OPENED2 for clarity.
> >
> > What needs to be clarified?
> > A DL_OPENED2 without DL_OPENED looks strange to me.
> > Isn't git log enough to see what has changed?
> 
> At now, logic of use of DL_OPENED flag lost in space. Many years ago,
> it was used to mark that fact what library was opened. It destroyed by
> commits in 2005-2006 years, so it is near impossible to get additional
> information about it.
> 
> Currently, we need just to know that library was opened more than
> once. Sorry if DL_OPENED2 name introduces misunderstanding, I could
> easily rename it to any better variant.

Than may be we should rename it to a better variant.
Could you resend v2 with that fixed?

thanks
 Waldemar
Leonid Lisovskiy June 22, 2016, 7:09 p.m. UTC | #4
On Wed, Jun 22, 2016 at 9:18 PM, Waldemar Brodkorb <wbx@uclibc-ng.org> wrote:
>>
>> Currently, we need just to know that library was opened more than
>> once. Sorry if DL_OPENED2 name introduces misunderstanding, I could
>> easily rename it to any better variant.
>
> Than may be we should rename it to a better variant.
> Could you resend v2 with that fixed?

Of course, yes. What name is the best from your point of view?

regards,
   Leonid
Waldemar Brodkorb June 22, 2016, 7:20 p.m. UTC | #5
Hi,
Leonid Lisovskiy wrote,

> On Wed, Jun 22, 2016 at 9:18 PM, Waldemar Brodkorb <wbx@uclibc-ng.org> wrote:
> >>
> >> Currently, we need just to know that library was opened more than
> >> once. Sorry if DL_OPENED2 name introduces misunderstanding, I could
> >> easily rename it to any better variant.
> >
> > Than may be we should rename it to a better variant.
> > Could you resend v2 with that fixed?
> 
> Of course, yes. What name is the best from your point of view?

No idea. I just dislike DL_OPENED2 if no DL_OPENED is in use :)

best regards
 Waldemar
Alex Potapenko June 22, 2016, 7:24 p.m. UTC | #6
Hi,

On Wed, Jun 22, 2016 at 10:20 PM, Waldemar Brodkorb <wbx@uclibc-ng.org>
wrote:

> Hi,
> Leonid Lisovskiy wrote,
>
> > On Wed, Jun 22, 2016 at 9:18 PM, Waldemar Brodkorb <wbx@uclibc-ng.org>
> wrote:
> > >>
> > >> Currently, we need just to know that library was opened more than
> > >> once. Sorry if DL_OPENED2 name introduces misunderstanding, I could
> > >> easily rename it to any better variant.
> > >
> > > Than may be we should rename it to a better variant.
> > > Could you resend v2 with that fixed?
> >
> > Of course, yes. What name is the best from your point of view?
>
> No idea. I just dislike DL_OPENED2 if no DL_OPENED is in use :)


Sorry for chiming in, but what about 'DL_REOPENED'? This exactly implies
that the lib has already been twice at the least, and no misleading '2'
suffix :)
diff mbox

Patch

diff --git a/ldso/include/dl-hash.h b/ldso/include/dl-hash.h
index d6282bb..bdb999a 100644
--- a/ldso/include/dl-hash.h
+++ b/ldso/include/dl-hash.h
@@ -153,7 +153,7 @@  struct elf_resolve {
 #define JMP_RELOCS_DONE	    0x000002
 #define INIT_FUNCS_CALLED   0x000004
 #define FINI_FUNCS_CALLED   0x000008
-#define DL_OPENED	    0x000010
+#define DL_OPENED2	    0x000010
 #define DL_RESERVED	    0x000020
 
 extern struct dyn_elf     * _dl_symbol_tables;
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 04e8c60..8f71aeb 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -546,6 +546,7 @@  struct elf_resolve *_dl_load_elf_shared_library(unsigned int rflags,
 		if (tpnt->st_dev == st.st_dev && tpnt->st_ino == st.st_ino) {
 			/* Already loaded */
 			tpnt->usage_count++;
+			tpnt->init_flag |= DL_OPENED2;
 			_dl_close(infile);
 			return tpnt;
 		}
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index 7bb6a34..4e8a49e 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -905,7 +905,7 @@  of this helper program; chances are you did not intend to run this program.\n\
 
 #ifdef __LDSO_LDD_SUPPORT__
 					if (trace_loaded_objects && !_dl_trace_prelink &&
-					    tpnt1->usage_count == 1) {
+					    !(tpnt1->init_flag & DL_OPENED2)) {
 						/* This is a real hack to make
 						 * ldd not print the library
 						 * itself when run on a
@@ -997,7 +997,7 @@  of this helper program; chances are you did not intend to run this program.\n\
 
 # ifdef __LDSO_LDD_SUPPORT__
 				if (trace_loaded_objects && !_dl_trace_prelink &&
-				    tpnt1->usage_count == 1) {
+				    !(tpnt1->init_flag & DL_OPENED2)) {
 					_dl_dprintf(1, "\t%s => %s (%x)\n",
 						    cp2, tpnt1->libname,
 						    DL_LOADADDR_BASE(tpnt1->loadaddr));
@@ -1034,6 +1034,8 @@  of this helper program; chances are you did not intend to run this program.\n\
 							/* Insert the ld.so only once */
 							ldso_tpnt = add_ldso(tpnt, load_addr,
 												 ldso_mapaddr, auxvt, rpnt);
+						} else {
+							ldso_tpnt->init_flag |= DL_OPENED2;
 						}
 						ldso_tpnt->usage_count++;
 						tpnt1 = ldso_tpnt;
@@ -1064,7 +1066,7 @@  of this helper program; chances are you did not intend to run this program.\n\
 
 #ifdef __LDSO_LDD_SUPPORT__
 				if (trace_loaded_objects && !_dl_trace_prelink &&
-				    tpnt1->usage_count == 1) {
+				    !(tpnt1->init_flag & DL_OPENED2)) {
 					_dl_dprintf(1, "\t%s => %s (%x)\n",
 						    lpntstr, tpnt1->libname,
 						    DL_LOADADDR_BASE(tpnt1->loadaddr));
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index 42a09a8..489c787 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -396,7 +396,7 @@  static void *do_dlopen(const char *libname, int flag, ElfW(Addr) from)
 	dyn_chain->next_handle = _dl_handles;
 	_dl_handles = dyn_ptr = dyn_chain;
 
-	if (tpnt->usage_count > 1) {
+	if (tpnt->init_flag & DL_OPENED2) {
 		_dl_if_debug_print("Lib: %s already opened\n", libname);
 		/* see if there is a handle from a earlier dlopen */
 		for (handle = _dl_handles->next_handle; handle; handle = handle->next_handle) {
@@ -412,8 +412,6 @@  static void *do_dlopen(const char *libname, int flag, ElfW(Addr) from)
 		return dyn_chain;
 	}
 
-	tpnt->init_flag |= DL_OPENED;
-
 	_dl_if_debug_print("Looking for needed libraries\n");
 	nlist = 0;
 	runp = alloca(sizeof(*runp));