summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2008-02-17 23:44:36 +0100
committerMartin Mares <mj@ucw.cz>2008-02-17 23:44:36 +0100
commit2f4211843f4f68c2a8a92155c24ac72d5799379b (patch)
treecbd7f5de4f45af0456c379d0120b6fc4f6608952
parent85b751f3205499a2f1916859b35b3f296287a0a6 (diff)
downloadpciutils-2f4211843f4f68c2a8a92155c24ac72d5799379b.tar.gz
Control symbol exports in libpci.
When building the shared library, default visibility of symbols has been changed to hidden and public functions have been marked with PCI_ABI which makes the symbol visible.
-rw-r--r--README2
-rw-r--r--lib/Makefile2
-rw-r--r--lib/internal.h4
-rw-r--r--lib/pci.h64
4 files changed, 40 insertions, 32 deletions
diff --git a/README b/README
index 577c46a..c46bd72 100644
--- a/README
+++ b/README
@@ -68,7 +68,7 @@ when running make:
systems as a part of the standard libraries) and tries to
autodetect its presence if the option is not specified.
- SHARED=yes/ Build libpci as a shared library. Requires the GNU toolchain.
+ SHARED=yes/ Build libpci as a shared library. Requires GCC 4.0 or newer.
no/local The ABI of the shared library is intended to remain backward
compatible for a long time (we use symbol versioning to achieve
that, like GNU libc does). The value `local' includes the
diff --git a/lib/Makefile b/lib/Makefile
index 76083f5..1ce2398 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -50,7 +50,7 @@ $(PCILIB): $(addsuffix .o,$(OBJS))
$(AR) rcs $@ $^
$(RANLIB) $@
else
-CFLAGS += -fPIC
+CFLAGS += -fPIC -fvisibility=hidden
$(PCILIB): $(addsuffix .o,$(OBJS))
$(CC) -shared $(SONAME) -o $@ $^ $(LIB_LDLIBS)
endif
diff --git a/lib/internal.h b/lib/internal.h
index a1dc16f..81b2b83 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -6,6 +6,10 @@
* Can be freely distributed and used under the terms of the GNU GPL.
*/
+#ifdef __GNUC__
+#define PCI_ABI __attribute__((visibility("default")))
+#endif
+
#include "pci.h"
#include "sysdep.h"
diff --git a/lib/pci.h b/lib/pci.h
index 851e43f..bcd0f36 100644
--- a/lib/pci.h
+++ b/lib/pci.h
@@ -15,6 +15,10 @@
#define PCI_LIB_VERSION 0x020299
+#ifndef PCI_ABI
+#define PCI_ABI
+#endif
+
/*
* PCI Access Structure
*/
@@ -72,18 +76,18 @@ struct pci_access {
};
/* Initialize PCI access */
-struct pci_access *pci_alloc(void);
-void pci_init(struct pci_access *);
-void pci_cleanup(struct pci_access *);
+struct pci_access *pci_alloc(void) PCI_ABI;
+void pci_init(struct pci_access *) PCI_ABI;
+void pci_cleanup(struct pci_access *) PCI_ABI;
/* Scanning of devices */
-void pci_scan_bus(struct pci_access *acc);
-struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func); /* Raw access to specified device */
-void pci_free_dev(struct pci_dev *);
+void pci_scan_bus(struct pci_access *acc) PCI_ABI;
+struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func) PCI_ABI; /* Raw access to specified device */
+void pci_free_dev(struct pci_dev *) PCI_ABI;
/* Names of access methods */
-int pci_lookup_method(char *name); /* Returns -1 if not found */
-char *pci_get_method_name(int index); /* Returns "" if unavailable, NULL if index out of range */
+int pci_lookup_method(char *name) PCI_ABI; /* Returns -1 if not found */
+char *pci_get_method_name(int index) PCI_ABI; /* Returns "" if unavailable, NULL if index out of range */
/*
* Named parameters
@@ -97,10 +101,10 @@ struct pci_param {
char *help; /* Explanation of the parameter */
};
-char *pci_get_param(struct pci_access *acc, char *param);
-int pci_set_param(struct pci_access *acc, char *param, char *value); /* 0 on success, -1 if no such parameter */
+char *pci_get_param(struct pci_access *acc, char *param) PCI_ABI;
+int pci_set_param(struct pci_access *acc, char *param, char *value) PCI_ABI; /* 0 on success, -1 if no such parameter */
/* To traverse the list, call pci_walk_params repeatedly, first with prev=NULL, and do not modify the parameters during traversal. */
-struct pci_param *pci_walk_params(struct pci_access *acc, struct pci_param *prev);
+struct pci_param *pci_walk_params(struct pci_access *acc, struct pci_param *prev) PCI_ABI;
/*
* Devices
@@ -133,16 +137,16 @@ struct pci_dev {
#define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3)
#define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf)
-u8 pci_read_byte(struct pci_dev *, int pos); /* Access to configuration space */
-u16 pci_read_word(struct pci_dev *, int pos);
-u32 pci_read_long(struct pci_dev *, int pos);
-int pci_read_block(struct pci_dev *, int pos, u8 *buf, int len);
-int pci_write_byte(struct pci_dev *, int pos, u8 data);
-int pci_write_word(struct pci_dev *, int pos, u16 data);
-int pci_write_long(struct pci_dev *, int pos, u32 data);
-int pci_write_block(struct pci_dev *, int pos, u8 *buf, int len);
+u8 pci_read_byte(struct pci_dev *, int pos) PCI_ABI; /* Access to configuration space */
+u16 pci_read_word(struct pci_dev *, int pos) PCI_ABI;
+u32 pci_read_long(struct pci_dev *, int pos) PCI_ABI;
+int pci_read_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
+int pci_write_byte(struct pci_dev *, int pos, u8 data) PCI_ABI;
+int pci_write_word(struct pci_dev *, int pos, u16 data) PCI_ABI;
+int pci_write_long(struct pci_dev *, int pos, u32 data) PCI_ABI;
+int pci_write_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
-int pci_fill_info(struct pci_dev *, int flags); /* Fill in device information */
+int pci_fill_info(struct pci_dev *, int flags) PCI_ABI; /* Fill in device information */
#define PCI_FILL_IDENT 1
#define PCI_FILL_IRQ 2
@@ -152,7 +156,7 @@ int pci_fill_info(struct pci_dev *, int flags); /* Fill in device information */
#define PCI_FILL_CLASS 32
#define PCI_FILL_RESCAN 0x10000
-void pci_setup_cache(struct pci_dev *, u8 *cache, int len);
+void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI;
/*
* Filters
@@ -163,10 +167,10 @@ struct pci_filter {
int vendor, device;
};
-void pci_filter_init(struct pci_access *, struct pci_filter *);
-char *pci_filter_parse_slot(struct pci_filter *, char *);
-char *pci_filter_parse_id(struct pci_filter *, char *);
-int pci_filter_match(struct pci_filter *, struct pci_dev *);
+void pci_filter_init(struct pci_access *, struct pci_filter *) PCI_ABI;
+char *pci_filter_parse_slot(struct pci_filter *, char *) PCI_ABI;
+char *pci_filter_parse_id(struct pci_filter *, char *) PCI_ABI;
+int pci_filter_match(struct pci_filter *, struct pci_dev *) PCI_ABI;
/*
* Conversion of PCI ID's to names (according to the pci.ids file)
@@ -184,12 +188,12 @@ int pci_filter_match(struct pci_filter *, struct pci_dev *);
* PROGIF (classID, progif) -> programming interface
*/
-char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, ...);
+char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, ...) PCI_ABI;
-int pci_load_name_list(struct pci_access *a); /* Called automatically by pci_lookup_*() when needed; returns success */
-void pci_free_name_list(struct pci_access *a); /* Called automatically by pci_cleanup() */
-void pci_set_name_list_path(struct pci_access *a, char *name, int to_be_freed);
-void pci_id_cache_flush(struct pci_access *a);
+int pci_load_name_list(struct pci_access *a) PCI_ABI; /* Called automatically by pci_lookup_*() when needed; returns success */
+void pci_free_name_list(struct pci_access *a) PCI_ABI; /* Called automatically by pci_cleanup() */
+void pci_set_name_list_path(struct pci_access *a, char *name, int to_be_freed) PCI_ABI;
+void pci_id_cache_flush(struct pci_access *a) PCI_ABI;
enum pci_lookup_mode {
PCI_LOOKUP_VENDOR = 1, /* Vendor name (args: vendorID) */