From 393375e1fee969e7c80feac0cb1df718bd652578 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Sun, 20 Aug 2017 09:53:06 +0200 Subject: [PATCH] drivers: Remove dependency on linker implementation specific behaviour --- Makefile.am | 13 ++++++++++--- src/driver_list_start.c | 33 +++++++++++++++++++++++++++++++++ src/driver_list_stop.c | 33 +++++++++++++++++++++++++++++++++ src/drivers.c | 20 ++++++++------------ 4 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/driver_list_start.c create mode 100644 src/driver_list_stop.c diff --git a/Makefile.am b/Makefile.am index aec16d12..029e4641 100644 --- a/Makefile.am +++ b/Makefile.am @@ -168,15 +168,22 @@ libsigrok_la_SOURCES += \ src/scale/kern.c # Hardware drivers -noinst_LTLIBRARIES = src/libdrivers.la +noinst_LTLIBRARIES = src/libdrivers.la \ + src/libdrivers_head.la src/libdrivers_tail.la -src/libdrivers.o: src/libdrivers.la - $(AM_V_CCLD)$(LINK) src/libdrivers.la +src/libdrivers.o: src/libdrivers.la \ + src/libdrivers_head.la src/libdrivers_tail.la + $(AM_V_CCLD)$(LINK) src/libdrivers_head.la src/libdrivers.la \ + src/libdrivers_tail.la src/libdrivers.lo: src/libdrivers.o $(AM_V_GEN)echo "# Generated by libtool" > $@ $(AM_V_at)echo "pic_object='libdrivers.o'" >> $@ $(AM_V_at)echo "non_pic_object='libdrivers.o'" >> $@ +src_libdrivers_head_la_SOURCES = src/driver_list_start.c + +src_libdrivers_tail_la_SOURCES = src/driver_list_stop.c + src_libdrivers_la_SOURCES = src/drivers.c if HW_AGILENT_DMM diff --git a/src/driver_list_start.c b/src/driver_list_start.c new file mode 100644 index 00000000..7b6c7755 --- /dev/null +++ b/src/driver_list_start.c @@ -0,0 +1,33 @@ +/* + * This file is part of the libsigrok project. + * + * Copyright (C) 2017 Marcus Comstedt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include "libsigrok-internal.h" + +/* + * This marks the start of the driver list. This file must be linked + * before any actual drivers. + */ + +SR_PRIV const struct sr_dev_driver *sr_driver_list__start[] + __attribute__((section (SR_DRIVER_LIST_SECTION), + used, aligned(sizeof(struct sr_dev_driver *)))) + = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ }; diff --git a/src/driver_list_stop.c b/src/driver_list_stop.c new file mode 100644 index 00000000..ff2c51de --- /dev/null +++ b/src/driver_list_stop.c @@ -0,0 +1,33 @@ +/* + * This file is part of the libsigrok project. + * + * Copyright (C) 2017 Marcus Comstedt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include "libsigrok-internal.h" + +/* + * This marks the end of the driver list. This file must be linked + * after any actual drivers. + */ + +SR_PRIV const struct sr_dev_driver *sr_driver_list__stop[] + __attribute__((section (SR_DRIVER_LIST_SECTION), + used, aligned(sizeof(struct sr_dev_driver *)))) + = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ }; diff --git a/src/drivers.c b/src/drivers.c index c6165b63..7641e24d 100644 --- a/src/drivers.c +++ b/src/drivers.c @@ -3,6 +3,7 @@ * * Copyright (C) 2016 Lars-Peter Clausen * Copyright (C) 2016 Aurelien Jacobs + * Copyright (C) 2017 Marcus Comstedt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,17 +27,12 @@ /* * sr_driver_list is a special section contains pointers to all the hardware * drivers built into the library. The __start and __stop symbols are - * auto-generated by the linker (OSX needs a little help) and point to the start - * and end of the section. They are used to iterate over the list of all - * drivers. + * created from driver_list_start.c and driver_list_stop.c, and point to the + * start and end of the section. They are used to iterate over the list of + * all drivers. */ -#ifdef __APPLE__ -extern struct sr_dev_driver *__start_sr_driver_list __asm("section$start$__DATA$__sr_driver_list"); -extern struct sr_dev_driver *__stop_sr_driver_list __asm("section$end$__DATA$__sr_driver_list"); -#else -extern struct sr_dev_driver *__start_sr_driver_list; -extern struct sr_dev_driver *__stop_sr_driver_list; -#endif +SR_PRIV extern const struct sr_dev_driver *sr_driver_list__start[]; +SR_PRIV extern const struct sr_dev_driver *sr_driver_list__stop[]; /** @private * Initialize the driver list in a fresh libsigrok context. @@ -49,8 +45,8 @@ SR_API void sr_drivers_init(struct sr_context *ctx) array = g_array_new(TRUE, FALSE, sizeof(struct sr_dev_driver *)); #ifdef HAVE_DRIVERS - for (struct sr_dev_driver **drivers = &__start_sr_driver_list; - drivers < &__stop_sr_driver_list; drivers++) + for (const struct sr_dev_driver **drivers = sr_driver_list__start + 1; + drivers < sr_driver_list__stop; drivers++) g_array_append_val(array, *drivers); #endif ctx->driver_list = (struct sr_dev_driver **)array->data;