ld.so: Add architecture specific fields

Message ID 20171031163712.GA10434@gmail.com
State Committed
Commit 4a306ef1c8ff1cac292c2fd56a3b91d7bfdecefc
Headers

Commit Message

Lu, Hongjiu Oct. 31, 2017, 4:37 p.m. UTC
  To support Intel Control-flow Enforcement Technology (CET) run-time
control:

1. An architecture specific field in the writable ld.so namespace is
needed to indicate if CET features are enabled at run-time.
2. An architecture specific field in struct link_map is needed if
CET features are enabled in an ELF module.

This patch adds dl-procruntime.c to the writable ld.so namespace and
link_map.h to struct link_map.

Tested on x86-64.

Any comments?

H.J.
--
	* elf/dl-support.c: Include <dl-procruntime.c>.
	* include/link.h: Include <link_map.h>.
	* sysdeps/generic/dl-procruntime.c: New file.
	* sysdeps/generic/link_map.h: Likewise.
	* sysdeps/generic/ldsodefs.h: Include <dl-procruntime.c> in
	the writable ld.so namespace.
---
 elf/dl-support.c                 |  1 +
 include/link.h                   |  2 ++
 sysdeps/generic/dl-procruntime.c |  1 +
 sysdeps/generic/ldsodefs.h       | 11 +++++++----
 sysdeps/generic/link_map.h       |  1 +
 5 files changed, 12 insertions(+), 4 deletions(-)
 create mode 100644 sysdeps/generic/dl-procruntime.c
 create mode 100644 sysdeps/generic/link_map.h
  

Comments

H.J. Lu Nov. 8, 2017, 11:03 p.m. UTC | #1
On Tue, Oct 31, 2017 at 9:37 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> To support Intel Control-flow Enforcement Technology (CET) run-time
> control:
>
> 1. An architecture specific field in the writable ld.so namespace is
> needed to indicate if CET features are enabled at run-time.
> 2. An architecture specific field in struct link_map is needed if
> CET features are enabled in an ELF module.
>
> This patch adds dl-procruntime.c to the writable ld.so namespace and
> link_map.h to struct link_map.
>
> Tested on x86-64.
>
> Any comments?
>
> H.J.
> --
>         * elf/dl-support.c: Include <dl-procruntime.c>.
>         * include/link.h: Include <link_map.h>.
>         * sysdeps/generic/dl-procruntime.c: New file.
>         * sysdeps/generic/link_map.h: Likewise.
>         * sysdeps/generic/ldsodefs.h: Include <dl-procruntime.c> in
>         the writable ld.so namespace.
> ---
>  elf/dl-support.c                 |  1 +
>  include/link.h                   |  2 ++
>  sysdeps/generic/dl-procruntime.c |  1 +
>  sysdeps/generic/ldsodefs.h       | 11 +++++++----
>  sysdeps/generic/link_map.h       |  1 +
>  5 files changed, 12 insertions(+), 4 deletions(-)
>  create mode 100644 sysdeps/generic/dl-procruntime.c
>  create mode 100644 sysdeps/generic/link_map.h
>
> diff --git a/elf/dl-support.c b/elf/dl-support.c
> index 5e3de90598..235d3a7f46 100644
> --- a/elf/dl-support.c
> +++ b/elf/dl-support.c
> @@ -126,6 +126,7 @@ int _dl_starting_up = 1;
>  void *_dl_random;
>
>  /* Get architecture specific initializer.  */
> +#include <dl-procruntime.c>
>  #include <dl-procinfo.c>
>
>  /* Initial value of the CPU clock.  */
> diff --git a/include/link.h b/include/link.h
> index 3e1b2aefb7..82b77a6b41 100644
> --- a/include/link.h
> +++ b/include/link.h
> @@ -203,6 +203,8 @@ struct link_map
>                                        freed, ie. not allocated with
>                                        the dummy malloc in ld.so.  */
>
> +#include <link_map.h>
> +
>      /* Collected information about own RPATH directories.  */
>      struct r_search_path_struct l_rpath_dirs;
>
> diff --git a/sysdeps/generic/dl-procruntime.c b/sysdeps/generic/dl-procruntime.c
> new file mode 100644
> index 0000000000..a056184690
> --- /dev/null
> +++ b/sysdeps/generic/dl-procruntime.c
> @@ -0,0 +1 @@
> +/* No architecture specific definitions.  */
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 5efae2d96d..52a792a597 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -373,6 +373,13 @@ struct rtld_global
>    EXTERN void (*_dl_rtld_unlock_recursive) (void *);
>  #endif
>
> +  /* Get architecture specific definitions.  */
> +#define PROCINFO_DECL
> +#ifndef PROCINFO_CLASS
> +# define PROCINFO_CLASS EXTERN
> +#endif
> +#include <dl-procruntime.c>
> +
>    /* If loading a shared object requires that we make the stack executable
>       when it was not, we do it by calling this function.
>       It returns an errno code or zero on success.  */
> @@ -529,10 +536,6 @@ struct rtld_global_ro
>  #endif
>
>    /* Get architecture specific definitions.  */
> -#define PROCINFO_DECL
> -#ifndef PROCINFO_CLASS
> -# define PROCINFO_CLASS EXTERN
> -#endif
>  #include <dl-procinfo.c>
>
>    /* Names of shared object for which the RPATH should be ignored.  */
> diff --git a/sysdeps/generic/link_map.h b/sysdeps/generic/link_map.h
> new file mode 100644
> index 0000000000..a056184690
> --- /dev/null
> +++ b/sysdeps/generic/link_map.h
> @@ -0,0 +1 @@
> +/* No architecture specific definitions.  */
> --
> 2.13.6
>

I tested it with build-many-glibcs.py.  If there are no objections, I will
check it next week.

Thanks.
  
H.J. Lu Nov. 13, 2017, 4:01 p.m. UTC | #2
On Wed, Nov 8, 2017 at 3:03 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, Oct 31, 2017 at 9:37 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> To support Intel Control-flow Enforcement Technology (CET) run-time
>> control:
>>
>> 1. An architecture specific field in the writable ld.so namespace is
>> needed to indicate if CET features are enabled at run-time.
>> 2. An architecture specific field in struct link_map is needed if
>> CET features are enabled in an ELF module.
>>
>> This patch adds dl-procruntime.c to the writable ld.so namespace and
>> link_map.h to struct link_map.
>>
>> Tested on x86-64.
>>
>> Any comments?
>>
>> H.J.
>> --
>>         * elf/dl-support.c: Include <dl-procruntime.c>.
>>         * include/link.h: Include <link_map.h>.
>>         * sysdeps/generic/dl-procruntime.c: New file.
>>         * sysdeps/generic/link_map.h: Likewise.
>>         * sysdeps/generic/ldsodefs.h: Include <dl-procruntime.c> in
>>         the writable ld.so namespace.
>> ---
>>  elf/dl-support.c                 |  1 +
>>  include/link.h                   |  2 ++
>>  sysdeps/generic/dl-procruntime.c |  1 +
>>  sysdeps/generic/ldsodefs.h       | 11 +++++++----
>>  sysdeps/generic/link_map.h       |  1 +
>>  5 files changed, 12 insertions(+), 4 deletions(-)
>>  create mode 100644 sysdeps/generic/dl-procruntime.c
>>  create mode 100644 sysdeps/generic/link_map.h
>>
>> diff --git a/elf/dl-support.c b/elf/dl-support.c
>> index 5e3de90598..235d3a7f46 100644
>> --- a/elf/dl-support.c
>> +++ b/elf/dl-support.c
>> @@ -126,6 +126,7 @@ int _dl_starting_up = 1;
>>  void *_dl_random;
>>
>>  /* Get architecture specific initializer.  */
>> +#include <dl-procruntime.c>
>>  #include <dl-procinfo.c>
>>
>>  /* Initial value of the CPU clock.  */
>> diff --git a/include/link.h b/include/link.h
>> index 3e1b2aefb7..82b77a6b41 100644
>> --- a/include/link.h
>> +++ b/include/link.h
>> @@ -203,6 +203,8 @@ struct link_map
>>                                        freed, ie. not allocated with
>>                                        the dummy malloc in ld.so.  */
>>
>> +#include <link_map.h>
>> +
>>      /* Collected information about own RPATH directories.  */
>>      struct r_search_path_struct l_rpath_dirs;
>>
>> diff --git a/sysdeps/generic/dl-procruntime.c b/sysdeps/generic/dl-procruntime.c
>> new file mode 100644
>> index 0000000000..a056184690
>> --- /dev/null
>> +++ b/sysdeps/generic/dl-procruntime.c
>> @@ -0,0 +1 @@
>> +/* No architecture specific definitions.  */
>> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
>> index 5efae2d96d..52a792a597 100644
>> --- a/sysdeps/generic/ldsodefs.h
>> +++ b/sysdeps/generic/ldsodefs.h
>> @@ -373,6 +373,13 @@ struct rtld_global
>>    EXTERN void (*_dl_rtld_unlock_recursive) (void *);
>>  #endif
>>
>> +  /* Get architecture specific definitions.  */
>> +#define PROCINFO_DECL
>> +#ifndef PROCINFO_CLASS
>> +# define PROCINFO_CLASS EXTERN
>> +#endif
>> +#include <dl-procruntime.c>
>> +
>>    /* If loading a shared object requires that we make the stack executable
>>       when it was not, we do it by calling this function.
>>       It returns an errno code or zero on success.  */
>> @@ -529,10 +536,6 @@ struct rtld_global_ro
>>  #endif
>>
>>    /* Get architecture specific definitions.  */
>> -#define PROCINFO_DECL
>> -#ifndef PROCINFO_CLASS
>> -# define PROCINFO_CLASS EXTERN
>> -#endif
>>  #include <dl-procinfo.c>
>>
>>    /* Names of shared object for which the RPATH should be ignored.  */
>> diff --git a/sysdeps/generic/link_map.h b/sysdeps/generic/link_map.h
>> new file mode 100644
>> index 0000000000..a056184690
>> --- /dev/null
>> +++ b/sysdeps/generic/link_map.h
>> @@ -0,0 +1 @@
>> +/* No architecture specific definitions.  */
>> --
>> 2.13.6
>>
>
> I tested it with build-many-glibcs.py.  If there are no objections, I will
> check it next week.
>
>

I am checking it in.
  

Patch

diff --git a/elf/dl-support.c b/elf/dl-support.c
index 5e3de90598..235d3a7f46 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -126,6 +126,7 @@  int _dl_starting_up = 1;
 void *_dl_random;
 
 /* Get architecture specific initializer.  */
+#include <dl-procruntime.c>
 #include <dl-procinfo.c>
 
 /* Initial value of the CPU clock.  */
diff --git a/include/link.h b/include/link.h
index 3e1b2aefb7..82b77a6b41 100644
--- a/include/link.h
+++ b/include/link.h
@@ -203,6 +203,8 @@  struct link_map
 				       freed, ie. not allocated with
 				       the dummy malloc in ld.so.  */
 
+#include <link_map.h>
+
     /* Collected information about own RPATH directories.  */
     struct r_search_path_struct l_rpath_dirs;
 
diff --git a/sysdeps/generic/dl-procruntime.c b/sysdeps/generic/dl-procruntime.c
new file mode 100644
index 0000000000..a056184690
--- /dev/null
+++ b/sysdeps/generic/dl-procruntime.c
@@ -0,0 +1 @@ 
+/* No architecture specific definitions.  */
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 5efae2d96d..52a792a597 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -373,6 +373,13 @@  struct rtld_global
   EXTERN void (*_dl_rtld_unlock_recursive) (void *);
 #endif
 
+  /* Get architecture specific definitions.  */
+#define PROCINFO_DECL
+#ifndef PROCINFO_CLASS
+# define PROCINFO_CLASS EXTERN
+#endif
+#include <dl-procruntime.c>
+
   /* If loading a shared object requires that we make the stack executable
      when it was not, we do it by calling this function.
      It returns an errno code or zero on success.  */
@@ -529,10 +536,6 @@  struct rtld_global_ro
 #endif
 
   /* Get architecture specific definitions.  */
-#define PROCINFO_DECL
-#ifndef PROCINFO_CLASS
-# define PROCINFO_CLASS EXTERN
-#endif
 #include <dl-procinfo.c>
 
   /* Names of shared object for which the RPATH should be ignored.  */
diff --git a/sysdeps/generic/link_map.h b/sysdeps/generic/link_map.h
new file mode 100644
index 0000000000..a056184690
--- /dev/null
+++ b/sysdeps/generic/link_map.h
@@ -0,0 +1 @@ 
+/* No architecture specific definitions.  */