Skip to content

Commit b44844b

Browse files
fix(win32): use dllexport/dllimport to avoid generate wrong 32 bits pesudo relocations
--export-all-symbols can't deal with this issue. fix estkme-group#424 Signed-off-by: Coelacanthus <uwu@coelacanthus.name>
1 parent c0f585f commit b44844b

24 files changed

Lines changed: 219 additions & 155 deletions

cjson-ext/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ target_sources(
1010
FILES
1111
cjson-ext/cJSON_ex.h
1212
)
13+
target_compile_definitions(cjson-ext PRIVATE CJSON_EXT_EXPORTS)

cjson-ext/cjson-ext/cJSON_ex.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "cJSON_ex.h"
22

3-
inline cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name, const char *const string) {
3+
CJSON_EXT_API cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name,
4+
const char *const string) {
45
if (string) {
56
return cJSON_AddStringToObject(object, name, string);
67
} else {

cjson-ext/cjson-ext/cJSON_ex.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,15 @@
22

33
#include <cjson/cJSON.h>
44

5-
cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name, const char *const string);
5+
#if defined(_WIN32)
6+
# ifdef CJSON_EXT_EXPORTS
7+
# define CJSON_EXT_API __declspec(dllexport)
8+
# else
9+
# define CJSON_EXT_API __declspec(dllimport)
10+
# endif
11+
#else
12+
# define CJSON_EXT_API
13+
#endif
14+
15+
CJSON_EXT_API cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name,
16+
const char *const string);

driver/CMakeLists.txt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ target_sources(
2222
)
2323

2424
add_library(euicc-driver-loader SHARED)
25+
target_compile_definitions(euicc-driver-loader PRIVATE DRIVER_EXPORTS)
2526
target_link_libraries(euicc-driver-loader PRIVATE euicc euicc-drivers ${DL_LIBRARY} ${CJSON_LIBRARY} lpac-utils)
2627
target_sources(
2728
euicc-driver-loader
@@ -38,11 +39,6 @@ target_sources(
3839
euicc-driver-loader.h
3940
)
4041

41-
# Only useful on Windows, and will lead to invalid arguments on ld.gold.
42-
if(WIN32)
43-
target_link_options(euicc-driver-loader PRIVATE "LINKER:--export-all-symbols")
44-
endif()
45-
4642
add_library(driver_apdu_stdio SHARED apdu/stdio.c)
4743
target_link_libraries(driver_apdu_stdio PRIVATE euicc euicc-drivers lpac-utils)
4844
set_target_properties(driver_apdu_stdio PROPERTIES PREFIX "")

driver/driver.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
# undef interface
55
#endif
66

7+
#if defined(_WIN32)
8+
# ifdef DRIVER_EXPORTS
9+
# define DRIVER_API __declspec(dllexport)
10+
# else
11+
# define DRIVER_API __declspec(dllimport)
12+
# endif
13+
#else
14+
# define DRIVER_API
15+
#endif
16+
717
enum euicc_driver_type {
818
DRIVER_APDU,
919
DRIVER_HTTP,

driver/euicc-driver-loader.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Needed by dlinfo(3).
22
#define _GNU_SOURCE
3-
#include "driver.h"
3+
4+
#include "euicc-driver-loader.h"
45

56
#include <lpac/list.h>
67
#include <lpac/utils.h>
@@ -38,8 +39,8 @@
3839
static const struct euicc_driver *_driver_apdu = NULL;
3940
static const struct euicc_driver *_driver_http = NULL;
4041

41-
struct euicc_apdu_interface euicc_driver_interface_apdu;
42-
struct euicc_http_interface euicc_driver_interface_http;
42+
DRIVER_API struct euicc_apdu_interface euicc_driver_interface_apdu;
43+
DRIVER_API struct euicc_http_interface euicc_driver_interface_http;
4344

4445
struct euicc_drivers_list {
4546
const struct euicc_driver *driver;
@@ -350,7 +351,7 @@ static inline const struct euicc_driver *find_driver(const enum euicc_driver_typ
350351
}
351352
}
352353

353-
int euicc_driver_list(int argc, char **argv) {
354+
DRIVER_API int euicc_driver_list(int argc, char **argv) {
354355
if (!init_driver_list()) {
355356
fputs("Driver list initialization failed.\n", stderr);
356357
return -1;
@@ -383,7 +384,7 @@ int euicc_driver_list(int argc, char **argv) {
383384
return 0;
384385
}
385386

386-
int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name) {
387+
DRIVER_API int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name) {
387388
_driver_apdu = find_driver(DRIVER_APDU, apdu_driver_name);
388389
if (_driver_apdu == NULL) {
389390
fprintf(stderr, "No APDU driver found\n");
@@ -409,7 +410,7 @@ int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name
409410
return 0;
410411
}
411412

412-
void euicc_driver_fini() {
413+
DRIVER_API void euicc_driver_fini() {
413414
if (_driver_apdu != NULL && _driver_apdu->fini != NULL) {
414415
_driver_apdu->fini(&euicc_driver_interface_apdu);
415416
}
@@ -418,7 +419,7 @@ void euicc_driver_fini() {
418419
}
419420
}
420421

421-
int euicc_driver_main_apdu(const int argc, char **argv) {
422+
DRIVER_API int euicc_driver_main_apdu(const int argc, char **argv) {
422423
if (_driver_apdu == NULL) {
423424
fprintf(stderr, "No APDU driver found\n");
424425
return -1;
@@ -430,7 +431,7 @@ int euicc_driver_main_apdu(const int argc, char **argv) {
430431
return _driver_apdu->main(&euicc_driver_interface_apdu, argc, argv);
431432
}
432433

433-
int euicc_driver_main_http(const int argc, char **argv) {
434+
DRIVER_API int euicc_driver_main_http(const int argc, char **argv) {
434435
if (_driver_http == NULL) {
435436
fprintf(stderr, "No HTTP driver found\n");
436437
return -1;

driver/euicc-driver-loader.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
#pragma once
22

3+
#include "driver.h"
34
#include <euicc/interface.h>
45

56
#include <inttypes.h>
67
#include <stddef.h>
78

8-
extern struct euicc_apdu_interface euicc_driver_interface_apdu;
9-
extern struct euicc_http_interface euicc_driver_interface_http;
9+
extern DRIVER_API struct euicc_apdu_interface euicc_driver_interface_apdu;
10+
extern DRIVER_API struct euicc_http_interface euicc_driver_interface_http;
1011

11-
int euicc_driver_list(int argc, char **argv);
12-
int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name);
13-
void euicc_driver_fini(void);
12+
DRIVER_API int euicc_driver_list(int argc, char **argv);
13+
DRIVER_API int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name);
14+
DRIVER_API void euicc_driver_fini(void);
1415

15-
extern int euicc_driver_main_apdu(int argc, char **argv);
16-
extern int euicc_driver_main_http(int argc, char **argv);
16+
DRIVER_API int euicc_driver_main_apdu(int argc, char **argv);
17+
DRIVER_API int euicc_driver_main_http(int argc, char **argv);

euicc/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ option(LIBEUICC_REDUCED_STDLIB_CALL "Reduce standard library calling" OFF)
22

33
if(LPAC_DYNAMIC_LIBEUICC)
44
add_library(euicc SHARED)
5+
target_compile_definitions(euicc PRIVATE LIBEUICC_EXPORTS)
56
else()
67
add_library(euicc STATIC)
78
endif()
@@ -55,6 +56,7 @@ target_sources(
5556
es10a.h
5657
es10c.h
5758
euicc.h
59+
euicc_export.h
5860
hexutil.h
5961
sha256.h
6062

@@ -68,10 +70,6 @@ set_target_properties(euicc PROPERTIES
6870
C_EXTENSIONS ON
6971
)
7072
if(LPAC_DYNAMIC_LIBEUICC)
71-
# Only useful on Windows, and will lead to invalid arguments on ld.gold.
72-
if(WIN32)
73-
target_link_options(euicc PRIVATE "LINKER:--export-all-symbols")
74-
endif()
7573
if (NOT STANDALONE_MODE)
7674
# Install a pkg-config file
7775
configure_file(libeuicc.pc.in libeuicc.pc @ONLY)

euicc/base64.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#pragma once
22

3-
int euicc_base64_decode_len(const char *bufcoded);
4-
int euicc_base64_decode(unsigned char *bufplain, const char *bufcoded);
5-
int euicc_base64_encode_len(int len);
6-
int euicc_base64_encode(char *encoded, const unsigned char *string, int len);
3+
#include "euicc_export.h"
4+
5+
EUICC_API int euicc_base64_decode_len(const char *bufcoded);
6+
EUICC_API int euicc_base64_decode(unsigned char *bufplain, const char *bufcoded);
7+
EUICC_API int euicc_base64_encode_len(int len);
8+
EUICC_API int euicc_base64_encode(char *encoded, const unsigned char *string, int len);

euicc/derutil.h

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include "euicc_export.h"
23

34
#include <inttypes.h>
45

@@ -18,20 +19,22 @@ struct euicc_derutil_node {
1819
} pack;
1920
};
2021

21-
int euicc_derutil_unpack_first(struct euicc_derutil_node *result, const uint8_t *buffer, uint32_t buffer_len);
22-
int euicc_derutil_unpack_next(struct euicc_derutil_node *result, struct euicc_derutil_node *prev, const uint8_t *buffer,
23-
uint32_t buffer_len);
24-
int euicc_derutil_unpack_find_alias_tags(struct euicc_derutil_node *result, const uint16_t *tags, uint32_t tags_count,
25-
const uint8_t *buffer, uint32_t buffer_len);
26-
int euicc_derutil_unpack_find_tag(struct euicc_derutil_node *result, uint16_t tag, const uint8_t *buffer,
27-
uint32_t buffer_len);
22+
EUICC_API int euicc_derutil_unpack_first(struct euicc_derutil_node *result, const uint8_t *buffer, uint32_t buffer_len);
23+
EUICC_API int euicc_derutil_unpack_next(struct euicc_derutil_node *result, struct euicc_derutil_node *prev,
24+
const uint8_t *buffer, uint32_t buffer_len);
25+
EUICC_API int euicc_derutil_unpack_find_alias_tags(struct euicc_derutil_node *result, const uint16_t *tags,
26+
uint32_t tags_count, const uint8_t *buffer, uint32_t buffer_len);
27+
EUICC_API int euicc_derutil_unpack_find_tag(struct euicc_derutil_node *result, uint16_t tag, const uint8_t *buffer,
28+
uint32_t buffer_len);
2829

29-
int euicc_derutil_pack(uint8_t *buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
30-
int euicc_derutil_pack_alloc(uint8_t **buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
30+
EUICC_API int euicc_derutil_pack(uint8_t *buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
31+
EUICC_API int euicc_derutil_pack_alloc(uint8_t **buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
3132

32-
long euicc_derutil_convert_bin2long(const uint8_t *buffer, uint32_t buffer_len);
33-
int euicc_derutil_convert_long2bin(uint8_t *buffer, uint32_t *buffer_len, long value);
34-
int euicc_derutil_convert_bits2bin(uint8_t *buffer, uint32_t buffer_len, const uint32_t *bits, uint32_t bits_count);
35-
int euicc_derutil_convert_bits2bin_alloc(uint8_t **buffer, uint32_t *buffer_len, const uint32_t *bits,
36-
uint32_t bits_count);
37-
int euicc_derutil_convert_bin2bits_str(const char ***output, const uint8_t *buffer, int buffer_len, const char **desc);
33+
EUICC_API long euicc_derutil_convert_bin2long(const uint8_t *buffer, uint32_t buffer_len);
34+
EUICC_API int euicc_derutil_convert_long2bin(uint8_t *buffer, uint32_t *buffer_len, long value);
35+
EUICC_API int euicc_derutil_convert_bits2bin(uint8_t *buffer, uint32_t buffer_len, const uint32_t *bits,
36+
uint32_t bits_count);
37+
EUICC_API int euicc_derutil_convert_bits2bin_alloc(uint8_t **buffer, uint32_t *buffer_len, const uint32_t *bits,
38+
uint32_t bits_count);
39+
EUICC_API int euicc_derutil_convert_bin2bits_str(const char ***output, const uint8_t *buffer, int buffer_len,
40+
const char **desc);

0 commit comments

Comments
 (0)