aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2003-08-30 06:00:33 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2003-08-30 06:00:33 +0000
commit759515c26a8aa034b9c3f4b6dfd3b187df48883c (patch)
treea0262e3557d083a8f287a66eaf3497319a0ef3d2
parent29a05f56d579e6845db6b90cab4acff47ab0dd22 (diff)
downloadbusybox-w32-759515c26a8aa034b9c3f4b6dfd3b187df48883c.tar.gz
busybox-w32-759515c26a8aa034b9c3f4b6dfd3b187df48883c.tar.bz2
busybox-w32-759515c26a8aa034b9c3f4b6dfd3b187df48883c.zip
handle GPLONLY symbols
-rw-r--r--modutils/insmod.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c
index c5cab1997..4676b5aa8 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -253,7 +253,7 @@
253#ifndef MODUTILS_MODULE_H 253#ifndef MODUTILS_MODULE_H
254static const int MODUTILS_MODULE_H = 1; 254static const int MODUTILS_MODULE_H = 1;
255 255
256#ident "$Id: insmod.c,v 1.100 2003/08/13 19:56:33 andersen Exp $" 256#ident "$Id: insmod.c,v 1.101 2003/08/30 06:00:33 bug1 Exp $"
257 257
258/* This file contains the structures used by the 2.0 and 2.1 kernels. 258/* This file contains the structures used by the 2.0 and 2.1 kernels.
259 We do not use the kernel headers directly because we do not wish 259 We do not use the kernel headers directly because we do not wish
@@ -474,7 +474,7 @@ int delete_module(const char *);
474#ifndef MODUTILS_OBJ_H 474#ifndef MODUTILS_OBJ_H
475static const int MODUTILS_OBJ_H = 1; 475static const int MODUTILS_OBJ_H = 1;
476 476
477#ident "$Id: insmod.c,v 1.100 2003/08/13 19:56:33 andersen Exp $" 477#ident "$Id: insmod.c,v 1.101 2003/08/30 06:00:33 bug1 Exp $"
478 478
479/* The relocatable object is manipulated using elfin types. */ 479/* The relocatable object is manipulated using elfin types. */
480 480
@@ -650,6 +650,8 @@ static enum obj_reloc arch_apply_relocation (struct obj_file *f,
650 650
651static void arch_create_got (struct obj_file *f); 651static void arch_create_got (struct obj_file *f);
652 652
653static int obj_gpl_license(struct obj_file *f, const char **license);
654
653#ifdef CONFIG_FEATURE_NEW_MODULE_INTERFACE 655#ifdef CONFIG_FEATURE_NEW_MODULE_INTERFACE
654static int arch_init_module (struct obj_file *f, struct new_module *); 656static int arch_init_module (struct obj_file *f, struct new_module *);
655#endif 657#endif
@@ -660,7 +662,6 @@ static int arch_init_module (struct obj_file *f, struct new_module *);
660//---------------------------------------------------------------------------- 662//----------------------------------------------------------------------------
661 663
662 664
663
664/* SPFX is always a string, so it can be concatenated to string constants. */ 665/* SPFX is always a string, so it can be concatenated to string constants. */
665#ifdef SYMBOL_PREFIX 666#ifdef SYMBOL_PREFIX
666#define SPFX SYMBOL_PREFIX 667#define SPFX SYMBOL_PREFIX
@@ -1927,11 +1928,14 @@ add_symbols_from(
1927 struct new_module_symbol *s; 1928 struct new_module_symbol *s;
1928 size_t i; 1929 size_t i;
1929 int used = 0; 1930 int used = 0;
1931 int gpl;
1930#ifdef SYMBOL_PREFIX 1932#ifdef SYMBOL_PREFIX
1931 char *name_buf = 0; 1933 char *name_buf = 0;
1932 size_t name_alloced_size = 0; 1934 size_t name_alloced_size = 0;
1933#endif 1935#endif
1934 1936
1937 gpl = obj_gpl_license(f, NULL) == 0;
1938
1935 for (i = 0, s = syms; i < nsyms; ++i, ++s) { 1939 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
1936 /* Only add symbols that are already marked external. 1940 /* Only add symbols that are already marked external.
1937 If we override locals we may cause problems for 1941 If we override locals we may cause problems for
@@ -1940,6 +1944,19 @@ add_symbols_from(
1940 struct obj_symbol *sym; 1944 struct obj_symbol *sym;
1941 char *name = (char *)s->name; 1945 char *name = (char *)s->name;
1942 1946
1947 /* GPL licensed modules can use symbols exported with
1948 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
1949 * exported names. Non-GPL modules never see any GPLONLY_
1950 * symbols so they cannot fudge it by adding the prefix on
1951 * their references.
1952 */
1953 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
1954 if (gpl)
1955 ((char *)s->name) += 8;
1956 else
1957 continue;
1958 }
1959
1943#ifdef SYMBOL_PREFIX 1960#ifdef SYMBOL_PREFIX
1944 /* Prepend SYMBOL_PREFIX to the symbol's name (the 1961 /* Prepend SYMBOL_PREFIX to the symbol's name (the
1945 kernel exports `C names', but module object files 1962 kernel exports `C names', but module object files
@@ -3612,6 +3629,7 @@ static void hide_special_symbols(struct obj_file *f)
3612 ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); 3629 ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info));
3613} 3630}
3614 3631
3632
3615#ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE 3633#ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
3616static int obj_gpl_license(struct obj_file *f, const char **license) 3634static int obj_gpl_license(struct obj_file *f, const char **license)
3617{ 3635{